我已经整理了一些代码来尝试通过Linux(ubuntu)中的串行端口读取二进制流。它表现得很奇怪,丢掉了一部分数据:
代码:
int nNeed;
PBYTE pChar = (PBYTE) malloc(1024*4096*sizeof(BYTE));
int nRead = 0;
int SRL = open("/dev/ttyS0", O_RDWR| O_NOCTTY | O_NDELAY | O_NONBLOCK );
struct termios tty;
struct termios tty_old;
memset (&tty, 0, sizeof tty);
// Error Handling
if ( tcgetattr ( SRL, &tty ) != 0 )
{
printf("\n ERROR: %d, %s \n", errno, strerror(errno));
}
// Save old tty parameters
tty_old = tty;
// Set Baud Rate
cfsetospeed (&tty, (speed_t)B57600);
cfsetispeed (&tty, (speed_t)B57600);
// Setting other Port Stuff, MAKE 8n1
tty.c_cflag &= ~PARENB;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~CRTSCTS; // no flow control
tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 1;
tty.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines
// Make raw
//cfmakeraw(&tty);
tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
tty.c_iflag &= ~(IXON | IXOFF |IXANY);
// Flush Port, then applies attributes
tcflush( SRL, TCIFLUSH );
if ( tcsetattr ( SRL, TCSANOW, &tty ) != 0)
{
printf("\n ERROR: %d, %s \n", errno, strerror(errno));
}
int count = 0;
int noread_cnt = 0;
nNeed = 1024;
while(1)
{
count++;
//pthread_mutex_lock(&mutex_comm);
nRead = read(SRL, pChar, nNeed);
//pthread_mutex_unlock(&mutex_comm);
if(nRead > 0)
{
printf("\n Read: %d ", nRead);
for (int i = 0; i < nRead; i++)
{
//printf("\n IN: (nRead) ");
//printf("%02x ",*pChar++);
printf("%02x ",pChar[i]);
}
printf("\n");
}
else if (nRead < 0)
{
if (errno == EAGAIN)
{
// Not real error, read again
noread_cnt++;
if (noread_cnt == 19200*100)
{
printf("EAGAIN\n");
noread_cnt = 0;
}
}
else
{
printf("\n nREad: %d, ERROR: %d, %s \n", nRead, errno, strerror(errno) );
}
}
sleep(0);
}
return NULL;
正在发送斜坡:00 11 22 3 44 55 66 77 88 99 aa bb cc dd ef ff
(通过已知工作的同事的测试应用程序发送)。
我的代码输出如下:
阅读:3 11 22 33
阅读:3 55 66 77
阅读:3 99 aa bb
阅读:3 dd ee ff
我的代码似乎丢弃了四个字节的第一个字节,即00,44,88和cc字节。
我是linux的新手,所以我假设我以某种方式错误地设置了端口。但是,我似乎无法找到问题所在。任何有关这方面的指导将不胜感激!
答案 0 :(得分:0)
我发现了这个问题。我在串口上运行了一个getty。我去了/ etc / init /并找到了ttyS0.conf文件。在它内部,它表示它正在运行一个getty,所以我评论了所有的线条。当我重新启动我的代码工作正常。但是,我确实知道,除非我取消注释getty指令,否则我没有默认的串行控制台终端。
Sawdust和Jim,谢谢你的评论。