Цитата(Symkin @ Nov 28 2012, 17:16)

Здравствуйте.
Возникла такая проблема: есть микроконтроллер PIC33, который связан с GSM-модемом с по RS232 с использованием CTS/RTS. Всё работает нормально, но время от времени одно из устройств (бывает как модем, так и PIC) выводит на линию квитирования запрещающий сигнал, и соответственно, другое устройство прекращает передачу. Система зависает в таком состояний и лечится только перезапуском.
Сама по себе передача небольшая - периодически по нескольку байт (как в одну сторону, так и в другую). UART и CTS/RTS на микроконтроллере управляются аппаратно. Скорость 9600.
У меня возникло предположение, что в модуле UART на МК (а может быть и на модеме) иногда возникают ошибки принятия (сбивки скорости, или ещё чего-нибудь), и приёмный буфер заполняется не полностью и зависает в таком подвешенном состоянии, и поэтому устройство запрещает дальнейший приём, высылая соовтетствующий сигнал на линию квитирования.
Может быть кто-нибудь уже сталкивался с подобным?
рс232 - асинхронный, у него нет тактов, все тактируется внутри устройств, потому если контроллер не повис, то любой сбой на шине просто будет воспринят как неправильные биты, он не может повиснуть в середине приема, байт все равно примется до конца.
Дальше если у вас есть контроль четности, то такой неверный байт может быть воспринят как ошибочный, и прерывание в контроллере пришел байт не возникает, а возникает прерывание пришел плохой байт. Вы это прерывание не обрабатываете, и следовательно буфер не чистите, и следовательно сигнал что буфер чист для приема не появляется, и следовательно передача повисает.
Вот так оно может быть, также может быть со стороны модема.
проверьте земли между приборами 232 очень чувствителен к землям. И проверьте все конденсаторы у преобразователя уровня уарт-232 если такой есть, оно тоже может вызывать сбои передачи.
Ну и последние уточните протокол в документации, возможно модем имеет режимы с реакцией ни на уровень, а на фронт ножки RTS, CTS и ими надо просто подергать.