Serialization 串行Arduino中随机损坏的数据
我在UWP C#中读取Arduino Uno的串行数据时遇到问题。有时,当我启动应用程序时,会收到损坏的数据。 但在arduino,监视器总是好的。 损坏的数据如下所示:Serialization 串行Arduino中随机损坏的数据,serialization,arduino,Serialization,Arduino,我在UWP C#中读取Arduino Uno的串行数据时遇到问题。有时,当我启动应用程序时,会收到损坏的数据。 但在arduino,监视器总是好的。 损坏的数据如下所示: 57 5 但应该是557 Arduino代码: String digx, digx2, digx3, digx1 ; void setup() { delay(500); Serial.begin(9600); } void loop() { int sensorValue = analogRead(A1)
57
5
但应该是557
Arduino代码:
String digx, digx2, digx3, digx1 ;
void setup() {
delay(500);
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A1);
sensorValue = map(sensorValue, 0, 1024, 0, 999);
digx1 = String(sensorValue % 10);
digx2 = String((sensorValue / 10) % 10);
digx3 = String((sensorValue / 100) % 10);
digx = (digx3 + digx2 + digx1);
Serial.println(digx);
Serial.flush();
delay(100);
}
和windows通用代码:
public sealed partial class MainPage : Page
{
public DataReader dataReader;
public SerialDevice serialPort;
private string data;
private async void InitializeConnection()
{
var aqs = SerialDevice.GetDeviceSelectorFromUsbVidPid(0x2341, 0x0043);
var info = await DeviceInformation.FindAllAsync(aqs);
serialPort = await SerialDevice.FromIdAsync(info[0].Id);
Thread.Sleep(100);
serialPort.DataBits = 8;
serialPort.BaudRate = 9600;
serialPort.Parity = SerialParity.None;
serialPort.Handshake = SerialHandshake.None;
serialPort.StopBits = SerialStopBitCount.One;
serialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
Thread.Sleep(100);
dataReader = new DataReader(serialPort.InputStream);
while (true)
{
await ReadAsync();
}
}
private async Task ReadAsync()
{
try
{
uint readBufferLength = 5;
dataReader.InputStreamOptions = InputStreamOptions.Partial;
//dataReader.UnicodeEncoding = UnicodeEncoding.Utf8;
var loadAsyncTask = dataReader.LoadAsync(readBufferLength).AsTask();
var ReadAsyncBytes = await loadAsyncTask;
if (ReadAsyncBytes > 0)
{
data = dataReader.ReadString(ReadAsyncBytes);
serialValue.Text = data;
}
}
catch (Exception e)
{
}
}
}
我的想法是,如果发生这种情况,程序会跳过这些数据。我尝试了不同的缓冲区长度,但大于或小于5的缓冲区总是接收不正确的
谢谢您的帮助。有两种方法可以解决您的问题 方法1:使UART通信健壮 不存在出错的可能性,但在windows软件与Arduino通信的情况下,这是一项棘手且耗时的任务 但是仍然有一些技巧可以帮助你,因为我已经尝试过了,其中一些很有效,但是请不要问为什么它有效
Serial.begin(9600)代码>至串行。开始(38400,串行\u 8N1)
其中8为数据位,1为停止位,N为串行\u 8N1中的奇偶校验无。您还可以在数据位、停止位和奇偶校验中尝试不同的设置。检查
Serial.println(digx)后不发送数据代码>。以字节数组的形式发送数据,使用Serial.write(digx,len)代码>。检查
您可以检查其直接公式基实现的CRC计算,以及小的起始检查此我使用了两种方法来解决此问题 1。在Windows代码中添加了
SerialDevice.IsDataTerminalReadyEnabled=true
属性以正确顺序读取字节。来自Microsoft文档
给你
2.在dharmik的帮助下,我使用array并使用Arduino中的Serial.write(array,arrayLength)
发送,然后使用dataReader.ReadBytes(array[])和Windows应用程序中的正确缓冲区大小读取
即使延迟小得多,结果也非常稳定。您的Windows代码不支持Arduino使用的帧。Arduino写入行,Windows代码读取五个字节的块。这是一个框架不匹配。如果Arduino写入行,则Windows代码必须读取行。否则,它不知道消息的结尾。谢谢,我会检查并报告。您正在发送哪个CRC是CRC16是,使用
getCrc()
。在你建议我的第一种方法中,问题是当arduino写入数组时,我将分别得到3位数字@dharmikCheck这篇文章的C#CRC16检查功能