Как выйти из чтения штрих-кода через COM-порт, нажав Enter?

Я использую свой сканер штрих-кода через COM-порт с кодом ниже, который имитирует POS-терминал и печатает название продукта и его цену на экране, извлеченном из базы данных MySQL. Проблема в том, что, хотя com-порт открыт и готов к чтению данных, loop until inkey=chr(13) не будет работать, когда я захочу выйти из «режима сканирования» и получить, к примеру, общую сумму.

Это написано на FreeBasic, но меня скорее интересует общая концепция, как решить эту проблему, а не решение для конкретного языка.

dim buffer as string*20   'reads a 20 character long string
do
if open com ("COM6:9600,N,,2" for input as #1) <> 0 then
print "Unable to open serial port. Press any key to quit application."sleep
end
end if

get #1,,buffer
print buffer
close #1
loop

0

Решение

Я не буду открывать / закрывать порт соединения снова и снова. Вместо этого я бы открыл соединение с устройством до начала цикла. В цикле я проверял события (нажата клавиша «новые входящие данные на COM-порт») и реагировал каким-то образом. Наконец, если цикл закончен, я бы закрыл соединение.

Псевдокод:

Open Connection
Do This
PressedKey = CheckForPressedKey()
If IncomingDataOnComPort? Then
Load Something From DB ...
EndIf
Until PressedKey Was ENTER
Close Connection

Непроверенный пример FreeBASIC:

' Took the COM port parameters from your question. Don't know if correct for the device.
Const ComPortConfig = "COM6:9600,N,,2"
Print "Trying to open COM port using connect string "; Chr(34); ComPortConfig; Chr(34); "..."If (Open Com ( ComPortConfig For Binary As #1 ) <> 0 ) Then
Print "Error: Could not open COM port! Press any key to quit."GetKey
End 1
End If

Print "COM port opened! Waiting for incoming data."Print
Print "Press ENTER to disconnect."Print

Dim As String ComDataBuffer = "", PressedKey = ""Do
' Key pressed?
PressedKey = Inkey
' Incoming data on COM port ready to be read?
If Loc(1) > 0 Then
ComDataBuffer = Space( Loc(1) )
Get #1, , ComDataBuffer
Print "Received data on COM port: "; chr(34); ComDataBuffer; chr(34)
End If
' Give back control to OS to avoid high cpu load due to permanent loop:
Sleep 1
Loop Until PressedKey = Chr(13) 'ENTER

Close #1

Print
Print "Disconnected. Press any key to quit."GetKey
End 0
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]