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