首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux串行端口:输入数据丢失

问Linux串行端口:输入数据丢失
EN

Stack Overflow用户
提问于 2016-08-04 21:09:07
回答 1查看 989关注 0票数 0
代码语言:javascript
复制
    #include <fcntl.h>   
    #include <termios.h> 
    #include <unistd.h>  
    #include <errno.h>   
    #include <cerrno>
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fstream>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <cstdlib>
    #include <ctime>

    using namespace std;
    typedef struct termios ComSet;

    int main()
    {
    int acm=-1;                                   
    acm=open("/dev/ttyACM0",O_RDWR | O_NOCTTY);
    if(acm == -1)
    {
    cout<<"Error Opening ttyACM0"<<endl;
    exit(1);
    }
    else
    {
    cout<<"Preparing ttyACM0..."<<endl;
    ComSet SerialSettings;
    tcgetattr(acm, &SerialSettings);
    cfsetispeed(&SerialSettings,B9600);
    cfsetospeed(&SerialSettings,B9600);

 /* 8N1 Mode */
    SerialSettings.c_cflag &= ~PARENB;   
    SerialSettings.c_cflag &= ~CSTOPB;   
    SerialSettings.c_cflag &= ~CSIZE;   
    SerialSettings.c_cflag |=  CS8;     

    SerialSettings.c_cflag &= ~CRTSCTS;       
    SerialSettings.c_cflag |= CREAD | CLOCAL; 


    SerialSettings.c_iflag &= ~(IXON | IXOFF | IXANY);          
    SerialSettings.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG);  
    SerialSettings.c_oflag &= ~OPOST;                           

 /* Setting Time outs */
    SerialSettings.c_cc[VMIN]  = 10;     /* Read at least 10 characters */
    SerialSettings.c_cc[VTIME] = 0;     /* Wait indefinetly   */

    if((tcsetattr(acm,TCSANOW,&SerialSettings)) != 0)   
    {
        cout<< " ERROR ! in Setting attributes"<<endl;

    }
    else
    {
        cout<< "=======ttyACM0 Setting====="<<endl;
        cout<<"BaudRate = 9600 StopBits = 1 Parity = none"<<endl;
        cout<<"Reading ttyACM0... "<<endl;
        char read_buffer[1024];                                
        bzero(read_buffer,1024);
        int read_bytes=0;                                      
        while(1)
         {
                tcflush(acm, TCIFLUSH);                        
                read_bytes=read(acm,&read_buffer,1024);        
                if(read_bytes>0)
                {
                    cout<<read_buffer;
                    bzero(read_buffer,1024);
                }

         }
    }



  close(acm); /* Close the serial port */

}

return 0;
}

由于某些原因,代码不能正常工作,我试图从一个arduino中读取,因为它在早些时候工作正常,它给我提供了乱码输出,例如

lo World!你好,世界!ello World!哈罗世界!哈罗世界!

改变的一件事是

在终端输出中有一个额外的新行,它使用cat /dev/ttyAMC0

你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!

我想要逐行阅读,因为它是由arduino发送到终端的

EN

回答 1

Stack Overflow用户

发布于 2016-08-04 21:50:38

当你得到像lo World ! Hello World ! ello World !这样的乱码输出时,这通常表明你的时钟速度(波特率)不匹配。确保你的Arduino以9600波特的速度书写。

此外,当Arduino输出字符时,它会将字符放入硬件缓冲区中。read()函数从该缓冲区中取出您指定的字节数-在本例中为1024。但您可能不希望每次都读取1024字节。相反,我认为你应该一直读到换行符。查看您正在使用的库中是否有readline()函数。

Linux cat命令可以正确读取,但该命令本身在末尾添加了额外的换行符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38768276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档