【问题标题】:Serial ReadLine in C# for Arduino doesn't work properlyArduino 的 C# 中的串行 ReadLine 无法正常工作
【发布时间】:2017-03-16 07:00:58
【问题描述】:

我想使用 C# IDE Visual Studio 将串行数据从 Arduino 发送到应用程序。我将以 9600 波特率发送 40 个字符。 C#中的Arduino之间的连接很好,问题是当我使用ReadLine命令将数据发送到C#时。我没有得到全部数据,而且总是有一些第一次数据丢失,例如,如果我在 C# 中发送 123456789,它读取的只是 456789 或 89 或 3456789。

#define TC1 A0
#define TC2 A1
#define TC3 A2
#define TC4 A3
#define TC5 A4
#define TC6 A5
#define TC7 A6
#define TC8 A7
//#define TC9 A8
//#define TC10 A9

float K1 = 1;
float K2 = 1;
float K3 = 1;
float K4 = 1;
float K5 = 1;
float K6 = 1;
float K7 = 1;
float K8 = 1;
float K9 = 1;
float K10 = 1;

int n = 10;
int temp[10];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int x = 100;
  temp[0]=analogRead(TC1)*K1*x*5/1023;
  temp[1]=analogRead(TC2)*K2*x*5/1023;
  temp[2]=analogRead(TC3)*K3*x*5/1023;
  temp[3]=analogRead(TC4)*K4*x*5/1023;
  temp[4]=analogRead(TC5)*K5*x*5/1023;
  temp[5]=analogRead(TC6)*K6*x*5/1023;
  temp[6]=analogRead(TC7)*K7*x*5/1023;
  temp[7]=analogRead(TC8)*K8*x*5/1023;
  temp[8]=analogRead(TC8)/5*200*K9;
  temp[9]=analogRead(TC8)/5*200*K10;

//  temp[0] = 1101;
//  temp[1] = 2327;
//  temp[2] = 114;
//  temp[3] = 6753;
//  temp[4] = 50;
//  temp[5] = 1;
//  temp[6] = 24;
//  temp[7] = 123;
//  temp[8] = 1269;
//  temp[9] = 3;


  for (int i = 0; i <= n - 1; i++) {
    char buff[] = {'0', '0', '0', '0'};
    int length_temp = String(temp[i]).length();

    for (int j = length_temp - 1; j >= 0; j--) {
      buff[j] = String(temp[i])[length_temp - j - 1];
    }

    for (int j = 0; j <= 3; j++) {
      Serial.write(buff[3 - j]);
    }

  }
  Serial.write('\n');
}

这是我的 Arduino 代码,这里是我的整个 C# 代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO.Ports;
using System.Windows.Forms;

namespace Display_data
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }


        private void start_Click(object sender, EventArgs e)
        {

        }

        private void stop_Click(object sender, EventArgs e)
        {
            //myport.Close();
            //textbox.Text = "Koneksi diputus!";
        }

        private void makefile_Click(object sender, EventArgs e)
        {
            //String simpan = @"C:\"; //Alamat penyimpanan
            //string nama_file = "Data.txt";
            //System.IO.File.WriteAllText(simpan + nama_file, (ch1.Text+','+ ch2.Text + ',' + ch3.Text + ',' + ch4.Text + ',' + ch5.Text + ',' + ch6.Text + ',' + ch7.Text + ',' + ch8.Text + ',' + ch9.Text + ',' + ch10.Text ));
            //MessageBox.Show("Data telah tersimpan di " + simpan + nama_file);

            //string nama_gambar = "Data.png";
            //this.grafik.SaveImage(simpan + nama_gambar, System.Windows.Forms.DataVisualization.Charting.ChartImageFormat.Png);
            //MessageBox.Show("Gambar telah tersimpan di " + simpan + nama_gambar);
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void Port_SelectedIndexChanged(object sender, EventArgs e)
        {

        }



        private void connect_Click(object sender, EventArgs e)
        {
            myport = new SerialPort();
            myport.BaudRate = 9600;
            myport.PortName = Port.Text;
            myport.DataReceived += receive;
            try
            {
                myport.Open();
                textbox.Text = "Connected";
            }
            catch (Exception)
            {
                textbox.Text = "Connection Failed!";
            }


        }

        int j;

        void receive(object sender, SerialDataReceivedEventArgs e)
        {
            string data = myport.ReadLine();
            int CHa;
            int CHb;
            int CHc;
            int CHd;
            int CHe;
            int CHf;
            int CHg;
            int CHh;
            int CHi;
            int CHj;

            j++;
            int delay = 500;

            CHa = Int32.Parse(data.Substring(0, 4));
            CHb = Int32.Parse(data.Substring(4, 4));
            CHc = Int32.Parse(data.Substring(8, 4));
            CHd = Int32.Parse(data.Substring(12, 4));
            CHe = Int32.Parse(data.Substring(16, 4));
            CHf = Int32.Parse(data.Substring(20, 4));
            CHg = Int32.Parse(data.Substring(24, 4));
            CHh = Int32.Parse(data.Substring(28, 4));
            CHi = Int32.Parse(data.Substring(32, 4));
            CHj = Int32.Parse(data.Substring(36, 4));


            //ch1.Text = data.Substring(0, 4);
            //ch2.Text = data.Substring(4, 4);
            //ch3.Text = data.Substring(8, 4);
            //ch4.Text = data.Substring(12, 4);
            //ch5.Text = data.Substring(16, 4);
            //ch6.Text = data.Substring(20, 4);
            //ch7.Text = data.Substring(24, 4);
            //ch8.Text = data.Substring(28, 4);
            //ch9.Text = data.Substring(32, 4);
            //ch10.Text = data.Substring(36, 4);


            ch1.Text = CHa.ToString();
            ch2.Text = CHb.ToString();
            ch3.Text = CHc.ToString();
            ch4.Text = CHd.ToString();
            ch5.Text = CHe.ToString();
            ch6.Text = CHf.ToString();
            ch7.Text = CHg.ToString();
            ch8.Text = CHh.ToString();
            ch9.Text = CHi.ToString();
            ch10.Text = CHj.ToString();

            this.grafik.Series["Ch 1"].Points.AddXY(j * delay, CHa);
            this.grafik.Series["Ch 2"].Points.AddXY(j * delay, CHb);
            this.grafik.Series["Ch 3"].Points.AddXY(j * delay, CHc);
            this.grafik.Series["Ch 4"].Points.AddXY(j * delay, CHd);
            this.grafik.Series["Ch 5"].Points.AddXY(j * delay, CHe);
            this.grafik.Series["Ch 6"].Points.AddXY(j * delay, CHf);
            this.grafik.Series["Ch 7"].Points.AddXY(j * delay, CHg);
            this.grafik.Series["Ch 8"].Points.AddXY(j * delay, CHh);
            this.grafik.Series["Ch 9"].Points.AddXY(j * delay, CHi);
            this.grafik.Series["Ch 10"].Points.AddXY(j * delay, CHj);
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void label11_Click(object sender, EventArgs e)
        {

        }
    }
}

那么问题是什么?是否需要锁定开放端口命令?

【问题讨论】:

    标签: c# arduino serial-port


    【解决方案1】:

    好的,我不太清楚,但是如果您将 '\n' 作为行尾写入串行端口,然后在 c# 中使用 ReadLine(我认为您使用 Windows?)它会给我带来问题。我使用了我自己的“行尾 cahr”。只需使用“!”之类的东西然后总是只读取一个字符并将其与“!”进行比较。

    伪代码:

    string msg = ""
    char read = readchar()
    if(read == '!')
        //stop reading
    else
        //add char to string
        msg += read
    

    【讨论】:

      【解决方案2】:

      解决了伙计们,我的问题是来自 arduino 的串行数据的第一行与我要发送的不完全一样,但是对于第二行,之后它就像我打印到串行的一样正常。我仍然不知道为什么,但我的方法只是跳过我的第一行传入数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-27
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        • 2015-04-07
        • 2011-08-31
        • 2020-08-01
        • 2013-08-26
        相关资源
        最近更新 更多