我在单板计算机(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不是巴斯,我想错了....“将数据发送到串行总线” - RS232不是“总线”。 “当我 开始发送数据“ - 你的写作风格令人困惑。什么样的 数据被发送到Olimex?对于cat / dev / ttyS0测试,你是怎么做的 设置串口,还是处于未知模式? bzero(安培; newtio, 的sizeof(newtio)); - 这是设置termios的危险方法 结构体。 newtio.c_cflag = BAUDRATE ......这不是正确的方法 设置波特率;你需要使用cfset [io] speed()函数。您 写一个“踢”,但你没有提到做任何明确的事情
我发送的数据是在Putty终端上输入的字符流。
对于/ dev / ttyS0测试,设置与c程序中设置的设置相同。我用stty验证了这个。
我从另一篇文章中复制了这段代码。我不确定bzero做了什么。如果你可以扩展“危险”那将是伟大的。或者更好的是,你有更好的方法来做bzero的工作吗?
我将更新设置波特率的方式..但发送工作正常,我使用stty确认波特率确实是115200.
就“踢”而言,我的意思是我需要在控制台上出现之前向uart发送一些字节数据。其他人提到FIFO可能是一个问题,但发送的第一个字符丢失。例如,如果我要发送字符串abcdefg ....我可以键入直到k然后l将出现在控制台上,然后l之后的任何未来字符也将出现在控制台中。如果我在启动接收程序(或cat / dev / ttyS0)后再次经历相同的过程,则接收开始出现的点可能位于不同的位置(即h或n)。