【问题标题】:Can't get C to write and read serial port无法让C读写串口
【发布时间】:2011-10-24 22:37:01
【问题描述】:

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

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

是的,串行设备 /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;
}

【问题讨论】:

  • 您对open() 的调用使用/dev/kitens。是不是打错字了?
  • 是的。这是我帖子中的错字。谢谢。

标签: c linux serial-port


【解决方案1】:

首先,

if (buff=msg)

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

第二,

if (buff == msg)

实际上是指针比较,而不是字符串比较。有关字符串比较,请参阅 C 标准库中的 strcmp()

第三,

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

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

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

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

【讨论】:

  • 我正要评论同样的事情,直到我看到你的。触摸
  • 但他真正想要的是if (strncmp (msg, buff, strlen(msg)) == 0)
  • iKiar: =) @ott--: 对。我只是暗示在哪里看,因为这个人正在学习:)
  • 感谢您的提示。我将比较更改为如下所示: while (strcmp(buff, msg)
  • 对,那是因为buff 仍未初始化。要么将其声明为 char buff[100](即长度为 100 的固定大小数组),要么查看 malloc()free() 的用途:)
【解决方案2】:

我看到很多错误:

  • 您应该始终检查返回值是否有错误。如果您的open_port 函数无法打开端口,则它可能会返回-1,但您会继续主循环。
  • 您没有检查读取的返回值,它可能是 -1,更有可能是因为您在文件上设置了 NDELAY。
  • 你没有初始化buf,它指向你不知道的地方,因为它没有被初始化。您可能想要使用 char buffer[1024] 或类似的东西。
  • 在 C 中,比较两个字符串是使用 strcmp 完成的,内存使用 memcmp。您正在比较两个指针,而不是它们的内容。

我认为这足以让您开始修复代码 :-)

【讨论】:

    【解决方案3】:

    此代码不起作用:

    while (buff != msg);
    

    buff 和 msg 是指针。您不能使用 == 或 != 比较字符串。你必须使用 strcmp()

    【讨论】:

      【解决方案4】:

      buff 指向哪里?它没有被初始化。

      另外,请记住,在 C 语言中,您不能使用 == 比较字符串,否则您将比较字符串的地址。也没有=,那是分配。如果末尾没有 NUL 字符且长度已知,则使用 strcmpmemcmp 比较字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 2012-01-22
        相关资源
        最近更新 更多