Работа через COM порт: искажение данных
Делаю проект на Visual C++. Программа будет передавать данные по COM порту железяке. Для разработки есть:
- программный эмулятор железяки (вещь проверенная)
- Virtual Serial Port Driver XP 5 - создает виртуальные порты и соединяет
- PortMon - мониторит порты
- ну и моя програма
Связь происходит по определенному протоколу. Железяка мастер - прога слейв. Для примиера схема связи:
железяка-COM1-COM6-программа
Проблема:
Если пакеты не большие по 5 байт. Обмен идет нормально.
Железяка отправляет пакет 16 байт. portmon отражает ушедший в порт1 пакет все правильно, а вот из 6 порта приходит только 13 байт: первые 9 байт правильные, а остальные неправильные (но при одном и том же пакете одинаковые). Ну и еще последний байт по значению правильный.
При открытии порта насройки одинаковые. portmon отражает это. Только одно отличие:
от железяки:
IOCTL_SERIAL_SET_HANDFLOW VSerial0 SUCCESS Shake:0 Replace:0 XonLimit:0 XoffLimit:0
от проги:
IOCTL_SERIAL_SET_HANDFLOW VSerial1 SUCCESS Shake:0 Replace:48 XonLimit:0 XoffLimit:0
Что это за параметр: Replace?
Как его установить?
Может сталкивались или есть идеи?
Помогите, плиз. Полтора дня бъюсь над этим.... :(
Кроме VSPD XP 5 какие-нибудь эмуляторы для соединения через сом-порты есть?
а соединить порты мамы кабелем не пробовал ? ) как самое простое .
Кроме VSPD XP 5 какие-нибудь эмуляторы для соединения через сом-порты есть?[/QUOTE]
Господин voral, Вы бы лучше код привели. Гадание на кофейной гуще и пляски с там тамами здесь не практикуются.
PS: И еще, в сети примеров класса-врапера для сериального порта видимо не видимо, выбираешь из них наиболее отвечающий требованиям, дорабатываешь если надо, прикручиваешь к нему свой протокол и радуешься.
Если я правильно помню, сигнал Data send ready (или как его там) у COM-порта возникает тогда, когда в буфере пусто. Нулевой байт это и есть "пусто". Поэтому если ориентироваться на прерывания, идущие от COM-порта, то с нулевыми байтами могут быть проблемы.
ПРоблему решил. Заключалась она в виртуальных портах (точнее в порте COM 6). (независимо от того какой утилитой я организую). Создал (при помощи VSPD XP) соединеие COM1(overlaped) - COM3(overlaped) и все заработало.
На нотере (физически нет сомпортов). Соединение COM1-COM2 также все заработало.
Может это связано с тем что в биосе, вроде, предусмотрено только 4 компорта..........