Я очень новичок в отправке данных через последовательный порт через .net, и после реализации протокола TCP я заметил, что с последовательным интерфейсом мне будет нелегко!
Итак, для начала, я почти на месте с моей реализацией последовательной двунаправленной связи, я просто застрял в нескольких вещах: -
- Мои чтения разбиты по нескольким сообщениям или получены как фрагментированный ответ через COM-порт, и я не знаю, какие настройки мне могут понадобиться, или как мне написать код по-другому, чтобы это исправить. Что может вызвать это? Я проверяю сообщение в точке останова на
SerialPort_DataReceived.
В основном данные должны быть отправлены как:
01: LS|DA090521|TI111043|q
02: PS|RN102|PTC|TA1040000|P#0|DA090521|TI111429|j
но он разделяется (в случайных позициях при каждом запрошенном чтении)
01: LS|DA090521|TI111
02: 043|q
03: PS|RN102|PTC|TA1
04: 0000|P#0|DA090521|TI111429|j
- Ответ на вопрос 1, спасибо Крису У. и другим! Теперь у меня есть сообщение, которое я ожидаю, что оно будет постепенно построено из фрагментов (в поисках STX, {msg body}, ETX), а затем действие, выполненное, когда сообщение будет полностью построено, и получило его с потокобезопасной очередью, очень рад .
. 2. Я получаю "|" Символ в моем чтении почти каждый цикл, это из-за команды, которую я как-то неправильно установил, артефакт последовательной связи или что-то, что устройство посылает мне? (Хотя я так не думаю, поскольку связь с гипертерминалом показывает, что этот персонаж не посылается непрерывно.)
, 3. Можете ли вы подтвердить, что я правильно читаю и записываю данные, используя соответствующие методы.
Спасибо, ребята, что посмотрели и на мои два других вопроса.
Соответствующий код выглядит следующим образом:
...
// COM3, 9600, None, 8, One
SerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBits);
if (SerialPort.IsOpen) SerialPort.Close();
// SerialPort.RtsEnable = true; // Request-to-send
// SerialPort.DtrEnable = true; // Data-terminal-ready
SerialPort.ReadTimeout = 150; // tried this, but didn't help
SerialPort.WriteTimeout = 150; // tried this, but didn't help
SerialPort.Open();
SerialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
}
void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// Process received data
SerialPort sp = (SerialPort)sender;
byte[] buffer = new byte[sp.BytesToRead];
int bytesRead = sp.Read(buffer, 0, buffer.Length);
// message has successfully been received
message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
}
public bool SendMessage(string text)
{
// Only send message if a client is connected
if (SerialPort != null && SerialPort.IsOpen)
{
byte[] buffer = Encoding.ASCII.GetBytes(text);
SerialPort.Write(buffer, 0, buffer.Length);
}
}