Я новичок в отправке данных через последовательный порт через .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);
}
}