Состояние памяти буфера
Эффективно пользоваться буфером, не зная его состояния, нельзя. Не переполняется ли он? Можно ли добавить ещё данные? И так далее. Поэтому у каждого из буферов последовательного порта есть свойства, позволяющие за ними следить:
Буфер RX
Полную ёмкость буфера приёма (RX) можно узнать через свойство ser.rxbuffsize. Сколько зафиксированных данных сейчас содержится в буфере приёма (RX), показывает свойство ser.rxlen (объяснение зафиксированных данных см. в разделе Настройки последовательного порта).
Иногда буфер приёма (RX) нужно очистить, не извлекая данные. В таких случаях пригодится ser.rxclear.
Буфер TX
Как и у буфера приёма (RX), у буфера передачи (TX) есть свойство ser.txbuffsize, позволяющее узнать его ёмкость.
В отличие от буфера приёма (RX), у буфера передачи (TX) есть два свойства «длины данных»: ser.txlen и ser.newtxlen. Свойство ser.txlen возвращает объём зафиксированных данных, ожидающих отправки из буфера (данные фиксируются методом ser.send). Свойство ser.newtxlen возвращает объём данных, которые попали в буфер, но ещё не зафиксированы для отправки.
У буфера передачи (TX) есть и свойство ser.txfree, которое прямо показывает, сколько в нём осталось места. Оно не учитывает незафиксированные данные в буфере - реальное свободное место равно ser.txfree - ser.newtxlen!
Чтобы очистить буфер передачи (TX), ничего не отправляя, используйте метод ser.txclear.
Вот пример, иллюстрирующий разницу между ser.txlen и ser.newtxlen:
sub on_sys_init
dim x,y as word ' declare variables
ser.rxbuffrq(1) ' Request one page for the RX buffer.
ser.txbuffrq(5) ' Request 5 pages for the TX buffer (which we will use).
sys.buffalloc ' Actually allocate the buffers.
ser.setdata("foofoo") ' Set some data to send.
ser.setdata("bar") ' Some more data to send.
ser.send ' Start sending the data (commit).
ser.setdata("baz") ' Some more data to send.
x = ser.txlen ' Check total amount of data in the TX buffer.
y = ser.newtxlen ' Check length of data not yet committed. Should be 3.
end sub 'Set up a breakpoint HERE.
Не выполняйте код по шагам. Отправка происходит быстро: пока вы дойдёте до x и y, проходя строку за строкой, буфер опустеет, и x и y будут равны 0. Поставьте точку останова в конце кода, а затем проверьте значения переменных (в панели Watch).