UART需要一些"踢"开始接收数据

时间:2014-04-04 18:43:52

标签: linux linux-device-driver uart

我在单板计算机(Olimex A13)上使用UART,我试图通过UART发送和接收数据。在发送方面我没有问题。 Olimex板将数据发送到串行总线,并在运行putty终端的外部PC上接收。

当我试图向另一个方向走(PC发送数据要由Olimex板接收)时,我遇到了一个奇怪的问题。当我开始发送数据时,最初没有数据显示在Olimex板上(我尝试了2种方法...... cat / dev / ttyS0并设置了接收C程序。两者都显示相同的结果)。

如果我发送一段时间的数据(似乎从少于10个字符到20多个字符),uart似乎“醒来”,现在数据出现在Olimex板上。一旦数据传输开始,它将按照我的要求以及快速或慢速数据速率继续运行。如果我突破接收程序或结束cat / dev / ttyS0进程并尝试再次开始接收,我需要经历“踢”uart的相同过程,直到它决定再次接收为止。

我已将示波器放在通向UART的RX引脚上。进入的数据处于良好的水平,数据从第一次发送开始显示在此处,因此数据最初未被阻止,然后在稍后的某个时间到达RX引脚。所以我现在假设问题是某种UART设置。有没有人知道可以解释这种行为的UART设置?

以下是我正在运行的接收程序。我不认为它存在问题,因为当我做cat / dev / ttyS0时我看到了相同的行为。这里的任何帮助将不胜感激。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>

#define BAUDRATE B115200
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1

  volatile int STOP=FALSE;

  main()
  {
    int fd,c, res;
    struct termios oldtio,newtio;
    char buf[255];

    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
    if (fd <0) {perror(MODEMDEVICE); return(-1); }

    tcgetattr(fd,&oldtio); /* save current port settings */

    bzero(&newtio, sizeof(newtio));
    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR;
    newtio.c_oflag = 0;

    /* set input mode (non-canonical, no echo,...) */
    newtio.c_lflag = 0;

    newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
    newtio.c_cc[VMIN]     = 1;   /* blocking read until 5 chars received */

    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&newtio);


    while (STOP==FALSE) {       /* loop for input */
      res = read(fd,buf,255);   /* returns after 5 chars have been input */
      buf[res]=0;               /* so we can printf... */
      printf("String:%s - Character Count:%d\n", buf, res);
      if (buf[0]=='z') STOP=TRUE;
    }
    tcsetattr(fd,TCSANOW,&oldtio);
  }

Sawdust发表了这些评论......

  

“将数据发送到串行总线” - RS232不是“总线”。 “当我   开始发送数据“ - 你的写作风格令人困惑。什么样的   数据被发送到Olimex?对于cat / dev / ttyS0测试,你是怎么做的   设置串口,还是处于未知模式? bzero(安培; newtio,   的sizeof(newtio)); - 这是设置termios的危险方法   结构体。 newtio.c_cflag = BAUDRATE ......这不是正确的方法   设置波特率;你需要使用cfset [io] speed()函数。您   写一个“踢”,但你没有提到做任何明确的事情

好吧,RS232不是巴斯,我想错了....

我发送的数据是在Putty终端上输入的字符流。

对于/ dev / ttyS0测试,设置与c程序中设置的设置相同。我用stty验证了这个。

我从另一篇文章中复制了这段代码。我不确定bzero做了什么。如果你可以扩展“危险”那将是伟大的。或者更好的是,你有更好的方法来做bzero的工作吗?

我将更新设置波特率的方式..但发送工作正常,我使用stty确认波特率确实是115200.

就“踢”而言,我的意思是我需要在控制台上出现之前向uart发送一些字节数据。其他人提到FIFO可能是一个问题,但发送的第一个字符丢失。例如,如果我要发送字符串abcdefg ....我可以键入直到k然后l将出现在控制台上,然后l之后的任何未来字符也将出现在控制台中。如果我在启动接收程序(或cat / dev / ttyS0)后再次经历相同的过程,则接收开始出现的点可能位于不同的位置(即h或n)。

0 个答案:

没有答案