Linux 串行端口:输入数据丢失 [英] Linux Serial Port: missing data on input
问题描述
#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 中读取数据,因为它早些时候工作正常,它给了我抓取的输出比如
for some reason code its not working properly i m trying to read from an arduino as it was working properly earlier its giving me grabled output such as
我的世界!你好,世界 !你好世界!世界!我的世界!
lo World ! Hello World ! ello World ! llo World ! llo World !
改变的一件事是
终端输出中有一个额外的新行,这是使用 cat/dev/ttyAMC0
there is one extra new line in terminal output this is using cat /dev/ttyAMC0
你好世界!
你好世界!
你好世界!
你好世界!
你好世界!
我想逐行阅读,因为它是由 arduino 发送到终端的
i want to read line by line and as it was sent by the arduino to terminal
推荐答案
当你得到像 lo World !你好,世界 !hello World !
那么这通常表示您的时钟速度(波特率)不匹配.确保您的 Arduino 以 9600 波特的速度写入.
When you get garbled output like lo World ! Hello World ! ello World !
then that usually indicates that your clock speed (baud rate) isn't matched. Make sure your Arduino is writing at a speed of 9600 baud.
此外,当 Arduino 输出字符时,它会将它们放入硬件缓冲区.read()
函数从该缓冲区中取出您指定的字节数 - 在本例中为 1024.但您可能不想每次都读取 1024 个字节.相反,我认为您应该阅读直到遇到换行符.查看您正在使用的库中是否有 readline()
函数.
Additionally, when the Arduino outputs characters, it puts them in a hardware buffer. The read()
function takes the number of bytes you specify out of that buffer- in this case 1024. But you probably don't want to read 1024 bytes every time. Instead, I think you should read until you reach a newline character. See if there is a readline()
function in the library you are using.
Linux cat
命令读取正确,但命令本身在末尾添加了一个额外的换行符.
The Linux cat
command is reading correctly, but the command itself adds an extra newline at the end.
这篇关于Linux 串行端口:输入数据丢失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!