读取USB串行端口(C; Mac OSX; Arduino)时的冗余

值班清洁

我正在编写一个简单的C程序,该程序可以从连接到Arduino设备的USB端口读取数据。Arduino以4600字节的块以9600的波特率输出数据。

我希望从Arduino到计算机的输入看起来像这样:

136.134.132.130.129.127.126.124.121.119.117.115.113.111。

但是,我得到这样的东西:

271.274.281..2.4062.4022.40225.4021

问题:如何在C程序中获得输入以与丢失数据/重新读取数据进行整齐的同步?当端口有新数据时,是否有某种标志可以告诉我的程序?

代码:

#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <errno.h>   /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <sys/types.h>


int open_port(void)
{
  int fd; /* File descriptor for the port */

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

  struct termios options;
  tcgetattr(fd,&options);
  cfsetospeed(&options,B9600);
  options.c_cflag |=(CLOCAL | CREAD);
  tcsetattr(fd, TCSANOW, &options);

  return (fd);
}


int main (){

    int i;
    for(i=0; i<50; i++){

    fcntl(open_port(), F_SETFL, FNDELAY);
    char buf[5];
    size_t nbytes;
    ssize_t bytes_read;

    nbytes = sizeof(buf);
    bytes_read = read(open_port(), buf, nbytes);
    printf("%s ", buf);
    buf[0]=0;
    }

    return 0;

}
锯末

您的程序未正确打开()串行端口以进行读取。
实际上,它在for循环的每次迭代中重复将其打开两次
设备只能通过程序打开一次。

代替

for (i=0; i<50; i++) {

   fcntl(open_port(), F_SETFL, FNDELAY);

   bytes_read = read(open_port(), buf, nbytes);

}

主程序的结构应类似于

fd = open_port();
if (fd < 0) {
    /* handle error condition */
}
rc = fcntl(fd, F_SETFL, FNDELAY);
if (rc < 0) {
    /* handle error condition */
}
for (i=0; i<50; i++) {


   bytes_read = read(fd, buf, nbytes);
   if (bytes_read < 0) {
        /* handle error condition */
    }

}
close(fd);

您的程序太“简单”了。它仅设置了一些属性,并且无需检查系统调用的返回码。

这应该是规范模式还是非规范(aka原始)模式(即数据ASCII文本还是二进制)?有关串行端口的正确设置,
请参阅本《串行编程指南》

从USB端口读取数据

USB是总线。
您的程序从中读取的设备是连接到该USBus的串行端口。

第二个编码问题

您的原始代码可能会打印垃圾数据。

nbytes = sizeof(buf);
bytes_read = read(open_port(), buf, nbytes);
printf("%s ", buf);
buf[0]=0;

read()操作返回的字节不太可能以NULL字节终止,因此对该读取缓冲区的字符串操作可能会超出分配的数组的范围。
不会表现不佳的代码如下所示:

nbytes = sizeof(buf) - 1;

bytes_read = read(fd, buf, nbytes);
if (bytes_read < 0) {
    /* handle error condition */
} else {
    buf[bytes_read] = 0; /* append terminator */
    printf("%s ", buf);
}

请注意,nbytes比缓冲区分配的大小小一。
这是为了确保当read()操作返回nbytes的“完整”缓冲区时,有一个可用字节来存储字符串终止符字节
为了提高效率,应在进入for循环之前而不是在循环内执行nbytes的分配

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Mac OSX的串行端口仿真器

来自分类Dev

如何释放/重置串行端口FTDI设备-Mac OSX

来自分类Dev

使用unistd.h和C写入Mac OSX 10.9.3上的串行端口

来自分类Dev

使用符号链接在Mac OSX中管理串行端口名称

来自分类Dev

使用符号链接在Mac OSX中管理串行端口名称

来自分类Dev

从Mac OSX Mavericks将代码加载到Arduino板时出现问题

来自分类Dev

Mac OSX上的C库安装

来自分类Dev

Mac OSX上的C库安装

来自分类Dev

是否有可用的软件实用程序在MAC OSx中进行USB端口嗅探?

来自分类Dev

Pharo:从Arduino串行端口读取字节

来自分类Dev

处理从串行端口读取的数据时,串行端口线程锁定

来自分类Dev

mac osx-Apache-一个网站,多个端口?

来自分类Dev

在Mac OSx上安装Android Studio时缺少平台工具

来自分类Dev

在Mac OSX上编译kerTeX时遇到问题

来自分类Dev

-bash::在Mac OSX中启动Shell时找不到命令

来自分类Dev

在Mac OSX上启动MySQL时出现问题

来自分类Dev

从串行端口读取时,随机算术溢出

来自分类Dev

从串行端口读取时接收截断的数据

来自分类Dev

完全卸载Mac OSX

来自分类Dev

Mac OSX javac -cp

来自分类Dev

Mac OSX上的Crontab

来自分类Dev

转换回Mac OSX

来自分类Dev

C# - Arduino 串行通信在读取数据时冻结(?)

来自分类Dev

Oracle Database 12c in VM on Mac OSX

来自分类Dev

Mac OSX上的VM中的Oracle Database 12c

来自分类Dev

从C ++在Mac OSX上启动打开对话框

来自分类Dev

c ++线程本地存储clang-503.0.40(Mac OSX)

来自分类Dev

Mac OSX Objective-c NSString内存与ARC泄漏

来自分类Dev

从C ++在Mac OSX上启动打开对话框