Цитата(Александр Куличок @ May 11 2007, 16:25)

После DSR=0 :
- Стандартный UART com-порта PC выдает еще на выход 1 байт инфомации (заканчивает текущую передачу).
- FT232BM - выдает 2 байта (заканчивает текущую передачу + выдает еще 1 байт). Проверял только на скорости 19200.
В Делфи использую компонент ComPort Library by Dejan Crnila. Ставлю тайм - аут на передачу и пишу в ком-порт в асинхронном режиме. При необходимости можно использовать событие OnTxCompleate.
Это не совсем верно.
1) Всё идёт от 16550. Там фифо буфер (у первых) 16 байт. Поэтому после приостановки потока может быть отправлено десяток и более байт.
Лично я не проверял сколько, но приостанавливаю когда буфер заполнен не до конца байт 16.
2) Приостанавливать надо (если использовать аппаратное управление компьютера) сигналом CTS
Код
RxU1:
stsx cbufe,X ; и сохранить
lds wl,cbufbl; Определить объём свободного места
lds wh,cbufbh
sub wl,Xl ; в буфере
sbc wh,Xh
brcc RxU2
subi wl,low(-lBuf); Откорректировать при перехлёсте
sbci wh,high(-lBuf); Откорректировать при перехлёсте
RxU2:
tst wh ; Осталось меньше 16 байт?
brne RxUE ; если нет, то выйти
cpi wl,16 ; Осталось меньше 16 байт?
brsh RxUE ; если нет, то выйти
sbi portCTS,CTS; Сбросить готовность модема
3) В обратную сторону тоже надо проверять. Компьютер может снять готовность (и делает это) RTS.
Код
sbis pinRTS,RTS ; если убран RTS
rjmp onl31
4) При программном управлении потоком (так называемым Xoff/Xon обмене) используется два знаменитых символа
Код
es22: .db 17; XON
es23: .db 19; XOFF
Естественно, что при программном управлении потока надо их убирать из потока. Поток также может оборваться не сразуже. Оно и понятно. Например при работе модема байт пять где-то бродят по проводам. Это я проверял лично.
Да и ещё на последок. Если используете HARD управление потоком, то позаботьтесь о выдаче готовности модема в линию, а то передача может и не начаться. Либо закольцуйте в вашем устройстве сигналы DSR/DTR.
Код
cbi portDSR,DSR; постоянно выдавать готовность модема
cbi portMR,MR; и подсвечивать её
sbi portDCD,DCD; сбросить сигнал DCD