Получите структуру через последовательный com порт с помощью C#
Всем привет,
Я пытаюсь отправить 1 символ и 8 переменных (26 байт) из arduino в качестве структуры через com-порт, я получаю что-то, но моя неопытность в C# не помогает,
Я использую этот код для отправки данных из arduino в приложение через com-порт. первый отправленный символ
Serial.write('/');это значит знать когда начать читать структуру
Typedef struct { char 1start; float 2a; float 3a; float 4a; float 5a; float 6a; float 7a; char 8end; } Payload; Payload payload; void setup() { Serial.begin(9600); } void loop() { payload.2a=2.22; payload.3a=3.33; payload.4a=4.44; payload.1start='#'; payload.8end='&'; payload.5a=5.55; payload.6a=6.66; payload.7a=7.77; _writeAnything(0, payload); } template <class T> long int _writeAnything(int ee, T& valuebt) { Serial.write('/'); Serial.write((byte *) &valuebt, sizeof(valuebt)); }
На стороне приложения c# есть проблема здесь я получаю что-то, но далеко не все, что я посылаю, я знаю, что первый отправленный символ получен
Serial.write('/');проблема заключается в том, чтобы поместить информацию обратно в одну структуру
namespace ConsoleApp1 { class Program { public struct PayloadSerial { public char 1start; public float 2b; public float 3b; public float 4b; public float 5b; public float 6b; public float 7b; public char 8tend; } static SerialPort _serialPort; static char rc; public static unsafe void Main() { _serialPort = new SerialPort(); _serialPort.PortName = "COM7";//Set your board COM _serialPort.BaudRate = 9600; _serialPort.DataBits = 8; _serialPort.Parity = Parity.None; _serialPort.StopBits = StopBits.One; _serialPort.Handshake = Handshake.None; _serialPort.DtrEnable = true; _serialPort.RtsEnable = true; _serialPort.Open(); PayloadSerial payloadSerial; while (true) { char someText = (char)_serialPort.ReadChar(); rc = someText; if (rc == '/') { byte* p = (byte*)&payloadSerial; int i; for (i = 0; i < 26; i++) { *p++ = (byte)_serialPort.ReadByte(); } //------------------- // if (payloadSerial.1start == '#' && payloadSerial.8end == '&') { Console.WriteLine(payloadSerial.2b); Console.WriteLine(payloadSerial.3b); Console.WriteLine(payloadSerial.4b); Console.WriteLine(payloadSerial.1tstart); Console.WriteLine(payloadSerial.8tend); Console.WriteLine(payloadSerial.5b); Console.WriteLine(payloadSerial.6b); Console.WriteLine(payloadSerial.7b); Console.WriteLine(" "); Console.WriteLine(" "); Thread.Sleep(50); } } } } }
то, что я получаю,-это значения не случайно 3.54846 E-38 ... или E-40, но они постоянны
Что я уже пробовал:
Поскольку у меня нет опыта работы в C#, я перепробовал все вещи через google, но ничего не было полезно, потому что все время я нахожу куски кода и не знаю, что включить или куда его поместить.
попробуйте изменить символ / байт
*p++ = (byte)_serialPort.ReadByte();
попробуйте изменить чтение байтов
for (i = 0; i < 26; i++)
Richard MacCutchan
Тип char в C# имеет ширину 16 бит, вы уверены, что Arduino-это то же самое?