Linux二进制串行读取问题

时间:2015-01-27 20:00:34

标签: c linux binary serial-port

我已经整理了一些代码来尝试通过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的新手,所以我假设我以某种方式错误地设置了端口。但是,我似乎无法找到问题所在。任何有关这方面的指导将不胜感激!

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。我在串口上运行了一个getty。我去了/ etc / init /并找到了ttyS0.conf文件。在它内部,它表示它正在运行一个getty,所以我评论了所有的线条。当我重新启动我的代码工作正常。但是,我确实知道,除非我取消注释getty指令,否则我没有默认的串行控制台终端。

Sawdust和Jim,谢谢你的评论。