2015年9月3日 星期四

[C語言] 在 Windows 上透過 C 語言實現 RS232 接收和發射

最近單晶片需要用到 IAP 的功能(可以參考基於 STM32 的 IAP 程式更新),不過之前電腦端是透過自己寫 Python 實現 .bin 檔案的傳輸,有時候重灌電腦後 Python 就被刪掉了,之後後還要再找符合相對應版本的 pySerial,蠻麻煩的,所以就想說直接用 C 語言來取代之前寫的 Python 功能。

STEP 1
先下載 RS232 for Windows Librery → http://www.teuniz.net/RS-232/
將 RS-232.tar.gz 解壓縮,只需要 rs232.c 和 rs232.h 即可。


STEP 2
建立一個 C 語言的專案,來撰寫程式,個人是使用 Code::Blocks



選擇 Empty project 即可




新增一個 .c 檔,存在專案目錄下,
我是命名成 main.c,然後加入 main.c, rs232.c rs232.h 到專案。





在 main 裡面加入 #include "rs232.h" 後,就可以使用 rs232 library 的功能了

STEP 3
下面程式是 main.c 裡面寫的內容,做簡單的字串接收並顯示出來,
另一端用自己設計的開發板 RedBeanSprout 實現,一直發送 5 個不同的字串到電腦。

#include "rs232.h"

#define RECV_BUF_SIZE 5

int main()
{
    int state = 0;

    int com_port = 6;       /* COM7 */
    int baudrate = 115200;  /* 115200 */
    char mode[]  = {'8', 'N', '1', 0};

    int i = 0, n = 0;
    unsigned long count = 2000000;

    unsigned char recv_buf[RECV_BUF_SIZE + 1] = {0};

    /* Open COM Port */
    state = RS232_OpenComport(com_port, baudrate, mode);
    if(!state)
        printf("Open COM Port Success\n\n");

    /* Recv Data */
    do {
        n = RS232_PollComport(com_port, recv_buf, RECV_BUF_SIZE);
        if(n == RECV_BUF_SIZE) {
            printf("count = %7i, n = %i, recv data = ", count, n);
            recv_buf[n] = '\0';
            printf("%s", (char *)recv_buf);
        }
        else if(n > 0) {
            printf("count = %7i, n = %i, recv data = ", count, n);
            printf("*****\n");
        }
       Sleep(1);
    } while(--count);

    /* Close COM Port */
    RS232_CloseComport(com_port);
    printf("\nClose COM Port\n");

    return(0);
}

發射部分使用 RS232_SendByte 或 RS232_SendBuf 就可以了,
這邊沒有放上來測試,主要是因為官網都已經解釋得很詳細了。

使用 C 語言來做 RS232 的好處主要在於可以有更多的變化,像是傳檔案、模擬部分 UART 裝置等,不像終端機只能做字串或字元的傳輸。

最後完整的專案可以在 github 上下載
https://github.com/Hom-Wang/C-Language/tree/master/serial