序列埠通訊是嵌入式與工控領域最基礎的資料傳輸方式。本文系統整理序列埠通訊原理、同步/非同步模式、RS-232 標準、全雙工/半雙工、流量控制、Linux 下裝置存取與程式設計要點。
電腦主機與外設、主機之間進行位元級串列傳輸,每個字元逐位傳送(1 或 0)。
| 方式 | 機制 | 特點 |
|---|---|---|
| 軟體 | XON/XOFF (0x11/0x13) | 佔用資料頻寬,不適用二進制傳輸 |
| 硬體 | RTS/CTS 訊號線 | 不佔用資料頻寬,可靠度高 |
/dev/ttyS0 (COM1)、/dev/ttyS1 (COM2) ... /dev/ttyUSB0 (USB 轉序列埠)
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd < 0) perror("open");
注意權限:需將裝置檔案權限開放或加入 dialout 群組。
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB; // 無校驗
options.c_cflag &= ~CSTOPB; // 1 停止位
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8; // 8 資料位
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 原始模式
tcsetattr(fd, TCSANOW, &options);
write(fd, "AT\r\n", 4);
char buf[256];
int n = read(fd, buf, sizeof(buf));
chmod 666 /dev/ttyS0 或加入 dialout 群組