![](/img/trans.png)
[英]Check if there's incoming data in serial port linux (cbInQue for 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讀取,因為它可以正常工作,這給了我諸如此類的輸出
羅世界! 你好,世界 ! 你好世界! llo世界! llo世界!
改變的一件事是
終端輸出中有一條額外的新行,這是使用cat / dev / ttyAMC0
你好,世界 !
你好,世界 !
你好,世界 !
你好,世界 !
你好,世界 !
我想逐行閱讀,因為它是由arduino發送到終端的
當您得到lo World ! Hello World ! ello World !
類的亂碼輸出時lo World ! Hello World ! ello World !
lo World ! Hello World ! ello World !
那么通常表明您的時鍾速度(波特率)不匹配。 確保您的Arduino的寫入速度為9600波特。
此外,當Arduino輸出字符時,會將它們放在硬件緩沖區中。 read()
函數從緩沖區中取出您指定的字節數-在這種情況下為1024。但是您可能不想每次都讀取1024字節。 相反,我認為您應該閱讀直到找到換行符為止。 查看您所使用的庫中是否有readline()
函數。
Linux cat
命令可以正確讀取,但是該命令本身在末尾添加了額外的換行符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.