因此,我开始在编写串行通信方案时出现一个重复出现的问题,而且这似乎是由于时序问题。我的嵌入式平台是Rabbit半导体公司的BL2600,在这种情况下,它正在与RS232设备通话。它向设备发出命令,设备将回复发送回BL2600,然后处理。什么使嵌入式设备上的RS232串行通信方案强大?
虽然我的问题是,当我发出命令,然后等待响应,我没有得到一个。但是,如果我在正确的位置设置断点,并单步执行代码,我通常会得到响应。我已将计算机置于BL2600和设备之间以监听RS232流(在看到最初的问题后),并且无论是否断点都会发送回复,但BL2600仅在其缓冲区中看到它如果我在解析代码的部分之前停止并尝试找到它的开始位。如果我断断续续地读完整个字符串,它就不会找到它。因此,这听起来像我没有足够的等待,所以现在只是为了荒谬,我已经设置了检查缓冲区的时间长达1秒(并且波特率为38400,它最好显示在那个窗口中),然而我仍然没有得到任何东西,除非我断断续续地单步执行。
下面是我的代码的显著部分:
//clear the buffers
serCwrFlush();
while(serCwrUsed())
{
;
}
startwait = MS_TIMER;
while((serCrdUsed() > 1) && (device_timeout_check < 1000))
{
if (MS_TIMER < startwait)
{ // fix the rollover
device_timeout_check = MS_TIMER + (ULONG_MAX - startwait);
}
else
{ //set it like normal
device_timeout_check = MS_TIMER - startwait;
}
serCrdFlush();
}
serCputs("mpcal=d\r"); //This is what requests the response from the device
while(serCwrUsed())
{
;
}
startwait = MS_TIMER;
while((serCrdUsed() < 11) && (device_timeout_check < 1000))
{
if (MS_TIMER < startwait)
{ // fix the rollover
device_timeout_check = MS_TIMER + (ULONG_MAX - startwait);
}
else
{ //set it like normal
device_timeout_check = MS_TIMER - startwait;
}
}
//grab it
temp=serCpeek();
i=0;
//It expects a response like "H0V0M00.0 /r"
//So I am looking for the first character.
while((temp != 'H') && (i<100))
{
serCgetc(); //breakpoint works here
temp=serCpeek();
i++;
}
c=serCread(comp_cal_string,20, 20); //breakpoint doesn't work here
我有一种感觉,我重新发明轮子,并且已经有人在我之前大概做到了这一点,至少在另一个平台上,所以它延迟了足够长的时间才能收到数据,但速度足够快以至于它实际上捕获了数据。
你用示波器看过信号吗?没有适当的范围,你不能做这样的事情。如果你在UART线路上有毛刺等,你可能会得到错误的输入。在开始编码之前,始终先验证实际信号是否正常。 – Lundin 2011-01-30 20:22:30