无法让C写入和读取串口

时间:2011-10-24 22:37:02

标签: c linux serial-port

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

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

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

我会非常感谢任何可以纠正错误的人。

#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;
}

4 个答案:

答案 0 :(得分:8)

首先,

if (buff=msg)

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

其次,

if (buff == msg)

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

第三,

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

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

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

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

答案 1 :(得分:3)

我看到很多错误:

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

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

答案 2 :(得分:0)

此代码不起作用:

while (buff != msg);

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

答案 3 :(得分:0)

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

另外,请记住,在C语言中,您无法使用==比较字符串,或者您将比较字符串的地址。也没有=,即任务。要比较字符串,请使用strcmpmemcmp,如果末尾没有NUL字符且长度已知。