Linux下用最少代码实现带十六进制参数的C语言串口原始字节发送
精简Linux串口发送C程序(接收十六进制参数)
Got it,给你整个最精简的实现,完全贴合你的需求——接收4个十六进制参数,拼接源地址后直接发送到串口,波特率直接用stty预先配置好的,不用额外折腾串口参数。
#include <fcntl.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char** argv) { if(argc != 5) return 1; // 必须传入4个十六进制参数 unsigned char buf[5] = {123}; // 首字节:源地址(十进制123 = 0x7B) for(int i=0; i<4; i++) buf[i+1] = strtol(argv[i+1], NULL, 16); // 参数转单字节拼入缓冲区 int fd = open("/dev/ttyS0", O_WRONLY); // 替换成你的串口设备,比如/dev/ttyUSB0 write(fd, buf, sizeof(buf)); close(fd); return 0; }
关键说明
- 参数要求:运行时必须传4个十六进制参数,比如
./send 01 AB CD FF - 帧结构:发送的字节串是
[源地址(0x7B)] + [参数1转字节] + [参数2转字节] + [参数3转字节] + [参数4转字节],总共5字节。如果需要调整源地址,直接改buf[0]的值就行(比如改成0x12就写18) - 串口设备:默认用
/dev/ttyS0,如果是USB转串口,改成/dev/ttyUSB0或者你的实际设备路径 - 波特率配置:完全依赖stty预先设置的参数,比如先执行
stty -F /dev/ttyUSB0 115200设置波特率,程序会自动沿用这个配置,不用在代码里重复设置 - 编译运行:
- 编译:
gcc send.c -o send - (可选)给用户串口权限:
sudo usermod -aG dialout $USER,避免每次用root运行 - 设置波特率后运行:
./send AA BB CC DD
- 编译:
可选优化(不增加太多行数的情况下)
如果需要严格检查输入的十六进制参数是否是合法单字节(避免超过0xFF的情况),可以在循环里加个判断:
for(int i=0; i<4; i++) { long val = strtol(argv[i+1], NULL, 16); if(val < 0 || val > 0xFF) return 1; buf[i+1] = val; }
内容的提问来源于stack exchange,提问作者Mike -- No longer here
相关产品推荐
相关产品推荐

