新闻中心
PRESS CENTER
SSH工具
推荐使用MobaXterm,或者选择自己习惯的SSH工具
https://iotrouter.yuque.com/attachments/yuque/0/2025/zip/40387797/1751447985727-10cb8014-e57d-4f95-85f2-722b2f822d6f.zip
串口调试工具
推荐使用XCOM,或者选择自己习惯的串口调试工具
https://iotrouter.yuque.com/attachments/yuque/0/2025/zip/40387797/1751448098345-cc351ada-aa82-4de7-b0bf-b6a909e637bc.zip
硬件工具
常用的调试工具有:CAN转USB工具 / 485转USB工具 / 网线等,请自行准备
交叉编译工具链
https://iotrouter.yuque.com/attachments/yuque/0/2025/tar/40387797/1751447691686-3001e3bf-2f16-43d3-a4d7-55c4705dff97.tar
软件环境
软件 | 版本 |
OS | 嵌入式Linux 20.04.1;部分裁剪 |
NodeJs | v22.16.0 |
Python | python3.8 |
Shell | bash |
GLIBC | 2.31 |
1. 串口
EC100自带两路自收发RS485
硬件接口 | 设备文件 |
RS485-1 | /dev/ttyS4 |
RS485-2 | /dev/ttyS3 |
注:自收发RS485,用户不需要关心收发切换,硬件会自动处理
1.1. 快速测试
使用minicom工具测试,具体使用方法可以百度或者咨询DeepSeek
1.2. 代码测试样例
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> #include <errno.h> #include <sys/select.h> #define BUFFER_SIZE 256 typedef struct { int baud_rate; // 波特率 int data_bits; // 数据位 (5,6,7,8) int stop_bits; // 停止位 (1,2) char parity; // 校验位 (N:无校验, O:奇校验, E:偶校验) } SerialConfig; int set_serial_attr(int fd, SerialConfig *config) { struct termios tty; if (tcgetattr(fd, &tty) < 0) { perror("tcgetattr"); return -1; } // 设置波特率 speed_t speed; switch (config->baud_rate) { case 9600: speed = B9600; break; case 19200: speed = B19200; break; case 38400: speed = B38400; break; case 57600: speed = B57600; break; case 115200: speed = B115200; break; default: fprintf(stderr, "Unsupported baud rate, using 115200 "); speed = B115200; } cfsetispeed(&tty, speed); cfsetospeed(&tty, speed); // 设置数据位 tty.c_cflag &= ~CSIZE; switch (config->data_bits) { case 5: tty.c_cflag |= CS5; break; case 6: tty.c_cflag |= CS6; break; case 7: tty.c_cflag |= CS7; break; case 8: tty.c_cflag |= CS8; break; default: fprintf(stderr, "Unsupported data bits, using 8 "); tty.c_cflag |= CS8; } // 设置停止位 if (config->stop_bits == 2) { tty.c_cflag |= CSTOPB; } else { tty.c_cflag &= ~CSTOPB; } // 设置校验位 switch (config->parity) { case 'N': case 'n': tty.c_cflag &= ~PARENB; // 无校验 break; case 'O': case 'o': tty.c_cflag |= PARENB; // 奇校验 tty.c_cflag |= PARODD; break; case 'E': case 'e': tty.c_cflag |= PARENB; // 偶校验 tty.c_cflag &= ~PARODD; break; default: fprintf(stderr, "Unsupported parity, using N "); tty.c_cflag &= ~PARENB; } // 其他设置 tty.c_cflag |= (CLOCAL | CREAD); // 启用接收和本地模式 tty.c_cflag &= ~CRTSCTS; // 无硬件流控 tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 原始输入模式 tty.c_oflag &= ~OPOST; // 原始输出模式 tty.c_cc[VMIN] = 1; // 最小读取字符数 tty.c_cc[VTIME] = 0; // 读取超时时间(单位:0.1秒) if (tcsetattr(fd, TCSANOW, &tty) < 0) { perror("tcsetattr"); return -1; } return 0; } int main(int argc, char *argv[]) { int fd; char *portname; if (argc < 2) { fprintf(stderr, "Usage: %s <serial_port> ", argv[0]); exit(EXIT_FAILURE); } portname = argv[1]; // 配置串口参数 SerialConfig config = { .baud_rate = 115200, // 波特率 .data_bits = 8, // 数据位 .stop_bits = 1, // 停止位 .parity = 'N' // 校验位 (N:无校验, O:奇校验, E:偶校验) }; fd = open(portname, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) { perror("open"); exit(EXIT_FAILURE); } if (set_serial_attr(fd, &config)) { close(fd); exit(EXIT_FAILURE); } printf("Serial port echo test running on %s ", portname); printf("Configuration: %d baud, %d data bits, %d stop bit, %c parity ", config.baud_rate, config.data_bits, config.stop_bits, config.parity); printf("Press Ctrl+C to exit. "); fd_set readfds; char buffer[BUFFER_SIZE]; int n; while (1) { FD_ZERO(&readfds); FD_SET(fd, &readfds); // 无限等待数据到达(移除了超时设置) if (select(fd + 1, &readfds, NULL, NULL, NULL) < 0) { perror("select"); break; } if (FD_ISSET(fd, &readfds)) { n = read(fd, buffer, BUFFER_SIZE - 1); if (n > 0) { buffer[n] = ' |