Итак, у меня начинает возникать повторяющаяся проблема с написанием схем последовательной связи, и, похоже, это связано с синхронизацией.Моя встроенная платформа - это Rabbit Semiconductor BL2600, и в данном случае она разговаривает с устройством на RS232.Он отправляет команду устройству, и устройство отправляет ответ обратно на BL2600, который затем обрабатывается.
Однако моя проблема заключается в том, что когда я отправляю команду, а затем жду ответаЯ не понимаю.Однако, если я устанавливаю точку останова в правильных местах и выполняю один шаг по коду, я часто получаю ответ.Я поместил свой компьютер между 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
У меня такое ощущение, что я заново изобретаю колесо, и что кто-то, вероятно, сделал это до меня, по крайней мере, на другой платформе, так что это откладываетсядостаточно долго для получения данных, но достаточно быстро для того, чтобы они действительно перехватывали данные.