我必须将文件逐个字节地从计算机(VB.NET)发送到串行连接的AT89s52。
在微控制器中,每个发送的字节都有一些工作要做,这需要一些时间。
下面是我的C代码中与接收字节相关的部分:
SCON = 0x50;
TMOD = 0x20; // timer 1, mode 2, 8-bit reload
TH1 = 0xFD; // reload value for 9600 baud
TR1 = 1;
TI = 1;
again:
while(RI!=0)
{
P1=SBUF; // show data on led's
RI=0;
receivedBytes++;
}
if (key1==0)
{
goto exitreceive; // break receiving
}
show_lcd_received_bytes(receivedBytes);
// here is one more loop
// with different duration for every byte
goto again;下面是用于发送字节的VB.NET代码:
For a As Integer = 1 To 10
For t As Integer = 0 To 255
SerialPort1.Write(Chr(t))
Next t
Next a问题是,在每个接收字节之后,mC有一些工作要做,而VB.NET不知道这一点,并且发送字节太快了,所以在mC中只完成了所有字节的一部分(大约10%)。我可以将“睡眠(20)”合并到VB循环中,然后事情就会正常工作,但我有很多浪费的时间,因为每个字节需要不同的时间来处理,这将是不可接受的缓慢通信。
现在,我的问题是,8051是否可以在发送之前在UART上设置一些VB可以读取的忙状态,以决定是否发送字节。或者如何建立如上所述的通信?我还尝试在mC端使用串行中断接收字节,结果相同。
硬件当然可以,因为我可以很好地将数据发送到计算机(正如预期的那样)。
发布于 2012-08-11 11:09:03
正如@TJD提到的,硬件流控制可用于在微型计算机处理接收到的字节时停止PC发送字符。在过去,我通过使用可用的端口线作为输出来实现硬件流。输出需要连接到TTL转RS-232驱动器(如果您当前使用的是RS-232,则可能有额外的驱动器可用)。如果您使用USB虚拟串行端口或RS-422/485,则需要实现软件流控制。通常,发送control-S来通知PC停止发送,发送control-Q来继续发送。为了充分利用流控制,您很可能还需要实现一个完全中断驱动的FIFO来接收/发送字符。
如果您想了解有关硬件流控制的更多信息,请查看http://electronics.stackexchange.com。
https://stackoverflow.com/questions/11900866
复制相似问题