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 發送:[長度][資料]。接收端需:
len。len 位元組。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;
}
0x01 讀溫度)。minicom 或 screen /dev/ttyS0 9600 直接觀察原始位元組流。tcflush、tcdrain 使用時機,避免殘留資料造成幀錯位。epoll 或 select 多路複用替代阻塞 read。Linux 序列埠程式設計核心在於 termios 正確配置、幀同步邏輯健全、非阻塞/多執行緒架構。參考本文範例可快速建立 ARM 與 CC2530 之間可靠的透明傳輸通道。