Отправка шестнадцатеричных данных в последовательный порт через C#
Я пытаюсь отправить шестнадцатеричные данные в последовательный порт, где я подключил регистратор данных, и ответ этого регистратора данных уже закодирован.
поэтому мне просто нужно отправить правильные шестнадцатеричные данные, чтобы получить этот вывод и отобразить его на консоли.
Код компилируется, но никаких данных не поступает.
Что я уже пробовал:
using System; using System.Collections.Generic; using System.IO; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SerialPortHexCommunication { public class Program { static void Main(string[] args) { SerialPort port = new SerialPort(); port.PortName = "COM5"; port.Parity = Parity.None; port.BaudRate = 9600; port.DataBits = 8; port.StopBits = StopBits.One; // port.Handshake = Handshake.RequestToSend; // port.ReceivedBytesThreshold = 8; if (port.IsOpen) { port.Close(); port.Dispose(); } byte[] bytesToSend = new byte[6] { 0xD0,0xF2,0xFF,0x00,0x06,0xC7 }; //$D0 $F2 $FF $00 $06 $C7 port.Open(); port.Write(bytesToSend,0,bytesToSend.Length); port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); port.Close(); port.Dispose(); } private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort port = (SerialPort)sender; int bytes = port.BytesToRead; byte[] buffer = new byte[bytes]; if (port.BytesToRead > 1) { port.Read(buffer, 0, bytes); } foreach (byte item in buffer) { Console.WriteLine(item); Console.ReadKey(); } //string indata = port.ReadExisting(); //Console.WriteLine("Data received"); //Console.WriteLine(indata); //Console.ReadKey(); } } }
0x01AA
Подумайте об этой последовательности:
port.Open();
port.Write(bytesToSend,0,bytesToSend.Length);
port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
port.Close();
port.Dispose();
Помимо всего прочего...
а) установите обработчик приема перед записью
б) вы пишете в порт и более или менее быстро закрываете порт. Это не сработает, по крайней мере, вам нужно дождаться ответа, прежде чем закрыть порт ;)
Nishikant Tayade
Я попробовал,но ничего не вышло.Не могли бы вы поподробнее?Это будет очень полезно
Nishikant Tayade
поэтому я попробовал еще раз, и он выдает результат 224.
Но когда я отправил тот же самый hex( $D0$F2$FF$00$06$C7) с терминалом, то он выдает Вывод Как E0 F2 01 00 3C 25 82 00 00 EA 95 20 01 2E 23 17 70 20 01 2C 23 17 70 20 01 36 23 17 70 20 01 2E 23 17 70 23 03 E8 23 03 E8 23 03 E8 23 03 E8 23 03 E8 23 03 E8 23 03 E8 23 03 E8 8F
это 224-Е0,но как насчет остального?
0x01AA
Что именно вы вводите в терминале?
Если вы наберете "$D0$F2$FF$00$06$C7", вам также нужно будет отправить ту же строку в свой код.В данный момент в вашем коде вы отправляете это как 6 байт, а не как шестнадцатеричные кодированные строки.
Вы можете попробовать/проверить это, когда отправляете точно такую же строку в своем коде, как вы отправляете ее с терминалом.
0x01AA
Кстати, еще одна вещь, из-за которой я столкнулся с большим количеством проблем на практике, и следующий прагматичный подход мне очень помог: перед закрытием порта я предлагаю сделать это port.DataReceived -= DataReceivedHandler
;
Nishikant Tayade
Я сделал то,что вы сказали ранее,теперь программа компилируется и выполняется, но она показывает вывод только тогда, когда находится в режиме отладки, в противном случае она просто завершается после выполнения без какого-либо вывода на консоль.
0x01AA
Поставьте что-нибудь вроде этого Console.ReadKey();
в конце концов static void Main(string[] args)
, в противном случае вы не увидите вывода
Nishikant Tayade
Уже сделал это.Но все то же самое
0x01AA
Чтобы помочь вам, вы должны опубликовать свой пересмотренный код.