Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 串行Arduino中随机损坏的数据_Serialization_Arduino - Fatal编程技术网

Serialization 串行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)

我在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);
  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通信的情况下,这是一项棘手且耗时的任务

但是仍然有一些技巧可以帮助你,因为我已经尝试过了,其中一些很有效,但是请不要问为什么它有效

  • 将您的UART波特率从9600更改为其他值(如果我的UART波特率在38400时工作正常的话)
  • 替换
    Serial.begin(9600)
    串行。开始(38400,串行\u 8N1)
    其中8为数据位,1为停止位,N为串行\u 8N1中的奇偶校验无。您还可以在数据位、停止位和奇偶校验中尝试不同的设置。检查
  • 将数据转换成字符串
    Serial.println(digx)后不发送数据。以字节数组的形式发送数据,使用
    Serial.write(digx,len)。检查
  • 方法2:添加CRC数据包

    在每个数据包的末尾发送。当它到达windows软件时,首先获取所有UART数据,然后根据该数据计算CRC,然后比较计算的CRC和接收的CRC。如果CRC匹配,则数据正确,如果不匹配,则忽略数据并等待新数据


    您可以检查其直接公式基实现的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检查功能