gpt4 book ai didi

无法让C读写串口

转载 作者:IT王子 更新时间:2023-10-29 00:44:56 25 4
gpt4 key购买 nike

这是我的第一个 C 程序。 Hello World !我敢肯定这对现在的高中程序员来说没问题,但是我上高中的时候他们没有编程。 :)

我想写入串行端口,直到我写入的字符串回显给我。然后做其他事情。我下面的代码运行了几秒钟,然后声称看到了字符串并结束了,即使它实际上并没有看到字符串。无论如何它的行为都是一样的,我显然有一些非常错误的地方。

是的,串行设备/dev/kittens 是真实的,并且当端口循环时,从终端接收(回显)到/dev/kittens 的 bash 回显字符串。

如果有人能纠正我的错误,我将不胜感激。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>


int fd;
char *buff;



int open_port(void)
{

fd = open("/dev/kitens", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
perror("open_port: Unable to open /dev/kittens ");
}
else
fcntl(fd, F_SETFL, 0);

return (fd);
}



int main()
{
int wr,rd;
open_port();

char msg[]="There are mice in the wire.\r";


do
{
/* Read from the port */
fcntl(fd, F_SETFL, FNDELAY);
rd=read(fd,buff,sizeof(msg));

/* Write to the port */
wr = write(fd, msg, sizeof(msg));
printf("debugging - Wrote to port\n");
usleep(10000);

if (wr < 0) {
fputs("write() to port /dev/kittens failed!\n", stderr);
break;
}
} while (buff != msg);

if (buff=msg)
printf(buff, "String Found! Now do the work.");
/*
system("dostuff.sh);
*/

/* Close the port on exit. */
close(fd);

return 0;
}

最佳答案

首先,

if (buff=msg)

是赋值,不是比较:) 后者是==

其次,

if (buff == msg)

其实是指针比较,不是字符串比较。对于字符串比较,请参阅 C 标准库中的 strcmp()

第三,

char *buff;
...
rd=read(fd,buff,sizeof(msg));

buff 未初始化 - 没有为它分配内存,所以你很高兴它根本不会崩溃。

好吧,还有更多需要检查的内容,但上面列出的内容已经足以阻止程序正常运行。

作为建议:尝试将调试 printf 放在 read 行下方,以查看实际从端口读取的内容。请记住,从端口读取的数据不能保证以零结尾(请参阅 zero-terminated strings 以供引用),因此您还必须注意这一点(在实际数据后添加一个零)数据,或以某种方式限制缓冲区上的字符串操作,例如使用 strncmp() 而不是 strcmp())。

关于无法让C读写串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7882778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com