У меня есть Arduino Uno с подключенным модулем Bluesmirf Silver. У моего Arduino есть датчик температуры, который регулярно записывает температуру. Arduino прослушивает любую строку, отправляемую ему через Bluetooth, и отвечает последними данными.
Я написал приложение на C # для получения этих данных, но я вижу странное поведение. Я использую следующий код для подключения, отправки строки и получения возвращенных данных.
mPort = new SerialPort(mPortName, 115200, Parity.None, 8, StopBits.One);
mPort.Open();
mPort.Write("download");
Thread.Sleep(1000);
while (mPort.BytesToRead > 0)
{
String data = mPort.ReadExisting();
this.BeginInvoke(new Action<String>(AddMessage), data);
}
Данные, которые я получаю, выглядят так:
Строка, добавленная локально в приложении C #:
Send: download
Строки добавлены на основе данных, полученных от Arduino:
Read: d???+?
GotData
------
Total Readings, 1069
Num Readings, 360
Lost Readings, 709
Reading Interval, 240000
------
350,19.34
351,19.34
352,19.34
353,20.31
....
Весь текст выглядит отлично, за исключением строки, которая возвращается, которую я отправил в Arduino. Что-то не так с отправкой данных?
К вашему сведению - таблица данных для модуля bluetooth находится здесь: http://www.sparkfun.com/datasheets/Wireless/Bluetooth/rn-bluetooth-um.pdf
@ Jeff - это код, который я использую на своем Arduino для получения данных: https://github.com/mchr3k/arduino/blob/master/tempsensor/StringReader.cpp
@ Jeff - stringDataLen определяет длину, и я вызываю полную функцию из этого файла: https://github.com/mchr3k/arduino/blob/master/tempsensor/tempsensor.ino
РЕДАКТИРОВАТЬ: Вот полный исходный код
Код C # по какой-то причине определенно неправильно управляет потоком. Я перешел на использование следующего кода в C #, и это позволяет получить строку без повреждения.
private void write(SerialPort mPort, string str)
{
foreach (char c in str)
{
mPort.Write(new char[] {c}, 0, 1);
Thread.Sleep(10);
}
}