写入linux中的串口

时间:2016-12-16 12:43:52

标签: c linux serial-port

我正在尝试编写一个在某些串行端口上具有motordrivers的机器人(即ttyS9)

通过cutecom(作为十六进制输入),我可以发送以下输入,它给出了我期望的结果:

5aaa0700fffff000

现在我正在尝试使用C程序获得相同的结果,它执行以下操作:

int port9 = open("/dev/ttyS9", O_RDWR | O_NONBLOCK);

char buff[17] = "5aaa0700fffff000";

write(port9, buff, 16);

我还尝试单独使用十六进制值初始化buff

buff[0] = 0x5;
buff[1] = 0xa;

等等。

两者都不起作用。我的代码或驱动程序中存在问题吗?

我使用gcc编译,然后用sudo运行它。 open函数还返回正确的值(无错误)以及写入。

2 个答案:

答案 0 :(得分:4)

使用字符串填充字符数组会将字符转换为ascii表示,而不是根据需要将其转换为十六进制。

char buff[17] = "5aaa0700fffff000"; // Incorrect for saving 0x5aaa0700fffff000 to buff

正如我所看到的,你想在串口上写8字节0x5aaa0700fffff000,字符是8位(1字节),你必须发送8字节而不是16字节,所以代码应该是这样的

buff[0] = 0x5a;
buff[1] = 0xaa;
...
write(port9, buff, 8);

答案 1 :(得分:-1)

但也许它是一个数字 所以你需要 unsigned long long int t= 0x5aaa0700fffff000; write(.., (char *)&t, 8);

这意味着内存中的字节顺序与您从屏幕上读取时只分配字节所获得的字节顺序完全不同。