2022年6月25日 星期六

UART over TTL/RS232

 

UART 是軟體層面的 serial 通訊協議(也可以借力 UART IC來完成)。定義baudrate, start bit, stop bit , data bit, parity check 等等, 但這些0和1都是只邏輯的0和1。而實際走的硬體訊號, 則要看使用的是TTL還是 RS232。TTL和 RS232 描述的是 Physical 電氣訊號。

TTL (transistor-transistor logic) 就是定義 0V 為 0,Vcc 為 1 , 一般 MCU、SoC 都會用的方式。  RS-232 定義 -3 to -25V 為 0, 而+3V~+25V為1。不過 RS232 是一個完善的標準通訊規範,所以尚包含硬體流量控制的機制及 Connector 的型式(如DB-9) 等內容。正常的PC 用的就是RS232 界面。不過若僅僅只是做基本的傳輸,不是拿來接數據機(Modem)這類的,其實也只是用了其中3條通訊線而已,TXD, RXD, GND。現在你懂了,為何 UART over TTL 只有3條訊號線的原因。

Source image: https://components101.com/


PC(RS232)—----- UART ——MCU (5V), 因為電壓不同所以要做level shifter , 這可以使用MX232之類的IC來完成. UART over RS-232 (上) 及 UART over TTL (下) 傳送 01010101的電壓圖。總之,我送0/1, 你要解讀成0/1, 而不是解讀成1/0。
Source Image: https://www.sparkfun.com/

相關文章: 


相關課程: 
[1] Linux 驅動程式設計 -實作LINUX UART/TTY Driver
[2] ARM Boot loader 設計-實作UART
[3] MUC 韌體設計-UART驅動


2022年6月22日 星期三

[C語言]字串處理函式:strspn, strpbrk



size_t strspn(const char *str1, const char *str2)  傳回str1包含了str2 字串中的字元,共有有多少個。
char *strpbrk(const char *str1, const char *str2)  傳回str1中出現str2字串中字元的位置。若沒有找到傳回NULL. 

char *d =strpbrk("my phone number is 23167736", "0123456789")
print("%c",d); ==> 卬出2

========================

 以處理HTTP header 的字串為例,  我們要逐行取出HTTP header的內容,  但要如何逐行進行呢? 
以下是使用 strspn(), strpbrk() 函式來完成的
 




參考: 
[1]程式參考


[2]   https://github.com/troglobit/merecat/blob/master/src/libhttpd.c




2022年5月30日 星期一

Disables dynamic cpufreq

 



Boot loader程式放入 Pi3中, 一開機剛開始跑的時候,LED 閃爍頻率都很正常 , 但大約經過約10秒左右 , 時間會變快 . 例如LED 0.5sec閃爍一次 , 經過10sec後變快小於0.5sec閃爍,是哪裡的設定需要再做調整修改 ?



#Disables dynamic cpufreq driver

add this line "force_turbo=1" to config.txt  . 

you can also google DVFS to get more information


2022年5月24日 星期二

[ C 語言] gcc 定義巨集

 

[ C 語言]

1.) 在程式檔中 (,c 或.h) 定義 DEBUG  

  #define DEBUG  

 



2.) 不改變在程式檔, 而是在程式編譯階段去定義 DEBUG    

gcc -DDEBUG  debug.c -o test 

另外也可以設定 DEBUG的值, 如 gcc -DDEBUG=4 debug.c -o test

(以上等同在hello.c 內加入了 #define DEBUG 或   #define DEBUG  4 這一行 )

其實, 若 寫 -DDEBUG  隱含  -DDEBUG=1 的意思 


注意: 若程式內及gcc 都同時定義了 DEBUG 這個符號 
,  會以程式碼內寫的為主。(會出現重覆定義的warning 訊息)

pi@ittraining:~/LinuxPro/trunk/source/ch3 $ gcc debug.c -DDEBUG=1 -o test

debug.c:4: warning: "DEBUG" redefined

 #define DEBUG 3

<command-line>: note: this is the location of the previous definition






2022年4月30日 星期六

[C 語言] 有無const 的差異?

 


char *s : 表示s 指標指向一個character
constant char *s : 表示s 指標指向一個constant character; 也就是所指向的字元不能被修改
可以參考底下範例, 觀察有無const 的差別.

#include <stdio.h>
int main()
{
const char str[]="hello";
str[0]='H';
printf(str);
return 0;

}

若是寫 const char *str="hello";
這str 本來就指向read only 的"hello"字串區域, 所以本來就不能更改, 因此
這兩個寫法結果沒有差異, 但用const char * str寫法可以讓別人知道, 不會透過str 來改變指標所指的內容.

char *str="hello"; 
const char *str="hello";


2022年3月29日 星期二

什麼是機器學習? (學習簡介)



訓練出好的AI模型的下一步是什麼 ? 就是AI佈署(Deployment ) , 你可以將AI模型佈署在雲端 或者佈署在邊緣的嵌入式的裝置上, 而嵌入式的裝置可以是指特定的微控制器上或是Android/iOS 手機上。











 

2022年3月15日 星期二

[MCU單晶片 Q&A] ADC工作頻率

 

Question:
要怎麼知道Fosc 是16MHz呢? Fosc 是MCU的固定property 還是是個可以設置的參數呢?

Answer: 
這是外部提供 16MHz 的 Crystal oscillator
p.s. 可參考上課文件的的電路圖  (WengPICV2_sch.pdf )