gpt4 book ai didi

c - Linux二进制串行读取问题

转载 作者:行者123 更新时间:2023-11-30 17:21:48 25 4
gpt4 key购买 nike

我编写了一些代码来尝试在 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 ee ff

(通过同事的已知可以工作的测试应用程序发送)。

我的代码的输出如下:

阅读:3 11 22 33

阅读:3 55 66 77

阅读:3 99 aa bb

读取:3 dd ee ff

我的代码似乎删除了四字节行的第一个字节,即 00、44、88 和 cc 字节。

我是 Linux 新手,所以我假设我以某种方式设置了错误的端口。但是,我似乎找不到问题所在。任何有关这方面的指导将不胜感激!

最佳答案

我已经发现问题了。我有一个 getty 在串行端口上运行。我转到/etc/init/并找到 ttyS0.conf 文件。在里面,它声明它正在运行 getty,所以我注释掉了所有行。当我重新启动时,我的代码工作正常。然而,我确实意识到,现在我没有默认的串行控制台终端,除非我取消注释 getty 指令。

锯末和吉姆,谢谢你们的评论。

关于c - Linux二进制串行读取问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28178937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com