我必须从计算机(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%)。我可以在 VB loop ant 中加入“Sleep(20)”然后事情会起作用,但是我浪费了很多时间,因为每个字节都需要不同的时间来处理,这将是不可接受的缓慢通信。
现在,我的问题是 8051 是否可以在 UART 上设置一些繁忙状态,VB 在发送之前可以读取这些状态来决定是否发送字节。或者如何以其他方式设置所描述的此类通信?我还尝试在 mC 端接收带有串行中断的字节,结果相同。
硬件肯定没问题,因为我可以很好地将数据发送到计算机(如预期的那样)。