首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux 序列埠通訊程式設計:7445 CPU 與 CC2530 ZigBee 協調器資料收發實作

     編輯:程式設計綜合問答

系統架構

7445 開發板 (ARM Linux)  -- UART/ttyS0  -->  CC2530 協調器  <-- ZigBee -->  終端節點(溫度感測)

序列埠初始化關鍵參數

struct termios opt;
tcgetattr(fd, &opt);
cfsetispeed(&opt, B9600);
cfsetospeed(&opt, B9600);
opt.c_cflag |= (CLOCAL | CREAD);    // 忽略調制解調器控制線、啟用接收
opt.c_cflag &= ~PARENB;             // 無奇偶校驗
opt.c_cflag &= ~CSTOPB;             // 1 停止位
opt.c_cflag &= ~CSIZE;
opt.c_cflag |= CS8;                 // 8 資料位
opt.c_cflag &= ~CRTSCTS;            // 無硬體流控
tcsetattr(fd, TCSANOW, &opt);
tcflush(fd, TCIOFLUSH);             // 清空緩衝區

資料幀格式解析

根據描述,CC2530 透過 UART 發送:[長度][資料]。接收端需:

  1. 讀取第一個位元組獲取長度 len。
  2. 循環讀取直到收滿 len 位元組。
  3. 組裝完整幀送往上層解析(OSAL/應用層)。

完整收發範例(簡化版)

int uart_fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
init_uart(uart_fd); // 上述參數設定

// 發送命令
void send_cmd(const unsigned char *cmd, int len) {
    write(uart_fd, cmd, len);
    tcdrain(uart_fd); // 等待發送完成
}

// 接收執行緒
void *recv_thread(void *arg) {
    unsigned char buf[256];
    while (running) {
        // 1. 讀取長度位元組
        if (read(uart_fd, buf, 1) != 1) continue;
        int payload_len = buf[0];
        if (payload_len > 254) continue; // 防禦

        // 2. 讀取 payload
        int got = 0;
        while (got < payload_len) {
            int r = read(uart_fd, buf + 1 + got, payload_len - got);
            if (r <= 0) break;
            got += r;
        }
        if (got == payload_len) {
            process_frame(buf + 1, payload_len); // 交給應用層
        }
    }
    return NULL;
}

ZigBee 協定棧互動

  • CC2530 端已內建 Z-Stack,接收 UART 指令後自動封裝為 ZigBee 封包發送。
  • 終端溫度資料經協調器透過 UART 以相同幀格式回傳。
  • ARM 端只需專注於 UART 幀同步與應用層指令定義(如 0x01 讀溫度)。

除錯建議

  • 使用 minicom 或 screen /dev/ttyS0 9600 直接觀察原始位元組流。
  • 記錄 tcflush、tcdrain 使用時機,避免殘留資料造成幀錯位。
  • 若資料量大,考慮使用 epoll 或 select 多路複用替代阻塞 read。

總結

Linux 序列埠程式設計核心在於 termios 正確配置、幀同步邏輯健全、非阻塞/多執行緒架構。參考本文範例可快速建立 ARM 與 CC2530 之間可靠的透明傳輸通道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved