C#串口通信问题,两个串口间互发信息 10C

一个串口com1向另一个串口com2发信息 比如发1-10之间的任意一个数,com2接收到后就会回复a ,11-20之间的数,com2就会回复b 以此类推 ,如果没回复,则com1继续向com2重复发。请大神们给个思路,或者最好是参考代码,谢谢

2个回答

C#非常的强大而且友好,串口的通信可以通过编程环境(这里我用的是Visual Studio 2010),如果有需要的话可以给我信息,我有完整版的安装包。如下图,简单的调用和选择就完成了串口的基本配置。

下面主要就是编程的问题了,在窗体Load的进程中可以完成串口的启动

复制代码
1 private void Form1_Load(object sender, EventArgs e)
2 {
3 serialPort1.PortName = "COM4";
4 serialPort1.BaudRate = 9600;
5 serialPort1.Open();
6 this.textBox1.Clear();
7 thread = new Thread(CrossThreadFlush);
8 thread.IsBackground = true;
9 thread.Start();
10 }
复制代码
而后就是读取数据的操作,这时候用到事件

1 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)

在这个事件里面编程就可以了,但是在对窗体内文本进行操作的时候会发现出现了线程的冲突和错误。网上给出的一种解决方法是采用代理的方式具体的程序如下

复制代码
1 public partial class Form1 : Form
2 {
3 private delegate void FlushClient(); //代理
4 Thread thread = null;
5 uint DateTemp;
6 uint Datefalg = 0;
7 uint counter = 0;
8 uint DateTemp1 = 0;
9 uint TMP1;
10 uint RH1;
11 uint PRESS1;
12 double TMP;
13 double RH;
14 double PRESS;
15
16 public Form1()
17 {
18 InitializeComponent();
19 }
20
21
22 private void Form1_Load(object sender, EventArgs e)
23 {
24 serialPort1.PortName = "COM4";
25 serialPort1.BaudRate = 9600;
26 serialPort1.Open();
27 this.textBox1.Clear();
28 thread = new Thread(CrossThreadFlush);
29 thread.IsBackground = true;
30 thread.Start();
31 }
32
33

34 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
35 {
36 counter=counter+1;
37 DateTemp = (uint)this.serialPort1.ReadByte();
38 if (DateTemp == 0xF1)
39 {
40 Datefalg = 1;
41 DateTemp1 = 0;
42 DateTemp = 0;
43 counter=0;
44 }
45 if (DateTemp == 0xF2)
46 {
47 Datefalg = 2;
48 DateTemp1 = 0;
49 DateTemp = 0;
50 counter=0;
51 }
52 if (DateTemp == 0xF3)
53 {
54 Datefalg = 3;
55 DateTemp1 = 0;
56 DateTemp = 0;
57 counter=0;
58 }
59 if (Datefalg == 1 && DateTemp != 0xF1)
60 { if(counter==1)
61 DateTemp1 = DateTemp;
62 if (counter == 2)
63 {
64 TMP1 = DateTemp1 * 256 + DateTemp;
65 TMP = (0.01 * TMP1) - 40;
66 }
67

68 }
69 if (Datefalg == 2 && DateTemp != 0xF2)
70 {
71 if (counter == 1)
72 DateTemp1 = DateTemp;
73 if (counter == 2)
74 {
75 RH1 = DateTemp1 * 256 + DateTemp;
76 RH = (0.0405 * RH1) - 4-0.0000028*RH1*RH1;
77 }
78
79 }
80 if (Datefalg == 3 && DateTemp != 0xF3)
81 {
82 if (counter == 1)
83 DateTemp1 = DateTemp;
84 if (counter == 2)
85 {
86 PRESS1 = DateTemp1 * 256 + DateTemp;
87 PRESS = (PRESS1-16384)*90/16384 + 30;
88 }
89 }
90 }
91
92 private void CrossThreadFlush()
93 {
94 while (true)
95 {
96 //将sleep和无限循环放在等待异步的外面
97 Thread.Sleep(500);
98 ThreadFunction();
99 }
100 }
101

102 private void ThreadFunction()
103 {
104 if (this.textBox1.InvokeRequired)//等待异步
105 {
106 FlushClient fc = new FlushClient(ThreadFunction);
107 this.Invoke(fc); //通过代理调用刷新方法
108

109 }
110 else
111 textBox1.Text = TMP.ToString("0.00");
112 if (this.textBox2.InvokeRequired)//等待异步
113 {
114 FlushClient fc = new FlushClient(ThreadFunction);
115 this.Invoke(fc); //通过代理调用刷新方法
116
117 }
118 else
119 textBox2.Text = RH.ToString("0.00");
120 if (this.textBox3.InvokeRequired)//等待异步
121 {
122 FlushClient fc = new FlushClient(ThreadFunction);
123 this.Invoke(fc); //通过代理调用刷新方法
124
125 }
126 else
127 textBox3.Text = PRESS.ToString("0.00");
128

129 }
130

131

132 }
复制代码
通过这样的一番调试之后才得以程序正确的运行,由于工科程序员和计算机程序员的编程思想还是有差别的,所以写的不好的地方请轻喷。

多线程处理串口的倒是没有,DEMO代码倒是有,你搜下 ThreadPool.QueueUserWorkItem 这个东西吧
var doEvents = new ManualResetEvent[threadCount];
for (var i = 0; i < threadCount; i++)
{
doEvents[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(DealData), new object[] { i, doEvents[i] });
}
WaitHandle.WaitAll(doEvents);
public void DealData(object eventParams) {

var threadId = (int)(((object[])eventParams)[0]); //当前线程ID

var doEvent = (ManualResetEvent)(((object[])eventParams)[1]);

var perThreadCount = dataTable.Rows.Count / threadCount; //平均每个线程处理数据
for (int i = 0; i < dataTable.Rows.Count; i++) {

      if (i < (threadId) * perThreadCount) continue;
if ((i >= (threadId + 1) * perThreadCount) && threadId != (threadCount - 1)) break;
ImportData(dataTable.Rows[i]);

}

doEvent.Set();

}

2 、

SerialPort类 的介绍
http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(v=vs.80).aspx

这个例子网上有,哎....我一直以为 serailport 不是一个控件呢!
我现在疑问?_难道 所有的再c#可以引用的类,都对应一个控件吗?

还有c#的添加监听器的方法,该如何添加呢?
如果是控件的话,直接双击控件就可以添加上监听器,但是对于一般的对象的话就得
用+=这个方法添加....还没怎么看c#,慢慢来

关于这个程序是有bug的,而且我也没有修正,因为串口对象的 readline是个阻塞方法,所以当你运行到这个语句的时候,如果读不到数据的话就会导致整个程序假死,只能强制终止 这个程序了

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;//新调用的类所在的命名空间

namespace 串口控制
{
public partial class Form1 : Form
{
//我用了控件,所以不用初始化对象了!!
//SerialPort sPort;//声明一个串口类对象,该对象的初始化我放到了

    public Form1() 
    { 
        InitializeComponent(); 


    } 

    //发送按钮的响应时间 
    private void button1_Click(object sender, EventArgs e) 
    { 

        //对于中文的话,要先对其进行编码,将其转换成 _Base64String ,否则你得不到中文字符串的 
        byte[] data = Encoding.Unicode.GetBytes(textBox1.Text); 
        string str = Convert.ToBase64String(data); 
        sPort.WriteLine(str); 
        MessageBox.Show("数据发送成功","系统提示"); 

    } 

    private void button2_Click(object sender, EventArgs e) 
    { 

        //解码然后将字符串赋值给 文本框的 文本区 
        byte[] data = Convert.FromBase64String(sPort.ReadLine()); 
        textBox2.Text = Encoding.Unicode.GetString(data); 

    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

        sPort.PortName = "com3";//串口的portname 
        sPort.BaudRate = 9600;//串口的波特率 
        sPort.Open(); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
       //关闭串口 
        sPort.Close(); 
    } 


} 

}


Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c#串口通信中上位机测试数据组帧

测试 发送数据的参数,设置温度频率时延输出功率,,这些数据组成一帧并且发送,然后接收,,,

C#中串口通信发送20字节的数据

20字节数据是指160位二进制数吗?转换成整型怎么定义,最大也只有64位?还是指一个一个的数据,总共有20个?

C#多个窗口使用用一个串口接受数据问题

我在主窗口MainForm中设置了Static SerialPort,在主界面注册了一个监听事件,然后在调到子界 之前,我注销了监听事件, serialPort.DataReceived -= new SerialDataReceivedEventHandler(serial_DataReceived); ``` 然后在子界面Calibration中使用了SerialPort,然后重新设置了监听事件: MainForm.serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived2); ``` 想实现的方式是:在子窗口关闭之前将监听事件取消,然后在主界面在重新设置监听事件,关闭子窗口后主界面实现的代码 calibrationForm = new Calibration( ); calibrationForm.ShowDialog(); if (calibrationForm.DialogResult == System.Windows.Forms.DialogResult.OK) { serialPort.DataReceived += new SerialDataReceivedEventHandler(serial_DataReceived); } 但是现在的结果是回到主界面后返回的数据仍然在子窗口事件监听器中显示(通过Console打印返回的数据大小) ``` 求大神指点!!! ```

C#串口通信接受数据的问题

我的情况是这样的:我需要接受多次数据,接收数据和发送数据都是按照一定的帧类型来发送的,并且把它们分别创建结构体。同时也创建了两个结构体用于字节流和结构体之间的转换,第一次我是接收到了数据的,第二次接收时因为需要接受内容比较多,所以定义了一个数组,可是再次运行时就报错了,是运行到字节流转为结构体时出的错。想请教各位大神。。

C#连接串口接受数据显示问题。很急。

C#串口上位机工具,接收到发过来的一串16进制数据,格式如下: FA AF 00 08 FF 31 32 33 34 FA AF 00 07 FF 35 36 后面可能还会有FA AF开头的 这串数据分析如下:识别FA AF为固定开始的头,紧接着后面的两个00 08为第一个整个字符串实际长度(FA AF 00 08 01 31 32 33 34),FF为固定的数据,不用管。 FF后面对应的数据为实际需要输出显示的数据(31 32 33 34),长度为4,然后这4个数据以正常的ASCII码显示出来。 第一个(FA AF 00 08 FF 31 32 33 34)实际需要的数据31 32 33 34对应的ASCII码为1234 第二个(FA AF 00 07 FF 35 36)实际需要的数据35 36对应的ASCII码为56 所以串口最终输出在textbox中显示为123456 以下代码是接受数据并显示在textbox的代码。怎么修改能达到以上的要求? ``` private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] ReDatas = new byte[ComDevice.BytesToRead]; ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据 this.AddData(ReDatas);//输出数据 } /// <summary> /// 添加数据 /// </summary> /// <param name="data">字节数组</param> public void AddData(byte[] data) { if (rbtnHex.Checked) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sb.AppendFormat("{0:x2}" + " ", data[i]); } AddContent(sb.ToString().ToUpper()); } else if (rbtnASCII.Checked) { AddContent(new ASCIIEncoding().GetString(data)); } else if (rbtnUTF8.Checked) { AddContent(new UTF8Encoding().GetString(data)); } else if (rbtnUnicode.Checked) { AddContent(new UnicodeEncoding().GetString(data)); } else {} lblRevCount.Invoke(new MethodInvoker(delegate { lblRevCount.Text = (int.Parse(lblRevCount.Text) + data.Length).ToString(); })); } /// <summary> /// 输入到显示区域 /// </summary> /// <param name="content"></param> private void AddContent(string content) { this.BeginInvoke(new MethodInvoker(delegate { if(chkAutoLine.Checked && txtShowData.Text.Length>0) { txtShowData.AppendText("\r\n"); } txtShowData.AppendText(content); })); } ```

C#串口通讯实时读取数据,把数据分成25个一组

大学刚毕业在做实习生,老大交代的小任务,现在遇到的瓶颈,请各位大神能多多指导一下,最好直接上代码,谢谢各位!!!新手没有积分,还望慷慨 串口实时读取设备的数据,一直读,现在要以25个数据为一组,在winform的list view中显示出来,一行25个,一行25个,该怎么做,谢谢!!!![图片说明](https://img-ask.csdn.net/upload/201907/20/1563605519_255343.png)

求教c#多线程操作串口的方法

需求是这样的。 1.有一个UI的主线程 。里面需要调用 串口通信。往里面发送消息。 2.另一方满我需要循环去取该串口有没有新的消息发送过来。然后将发送过来的消息传递给UI的主线程。 c#新手。请教各位。该怎么实现?

关于C# 将串行口通信放到事件函数了导致整个函数卡死

void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e) { var reference = e.FrameReference.AcquireFrame(); // Color using (var frame = reference.ColorFrameReference.AcquireFrame()) { if (frame != null) { //将图像转入writeablebitmmap FrameDescription colorFrameDescription = frame.FrameDescription; using (KinectBuffer colorBuffer = frame.LockRawImageBuffer()) { this.colorBitmap.Lock(); // verify data and write the new color frame data to the display bitmap if ((colorFrameDescription.Width == this.colorBitmap.PixelWidth) && (colorFrameDescription.Height == this.colorBitmap.PixelHeight)) { frame.CopyConvertedFrameDataToIntPtr( this.colorBitmap.BackBuffer, (uint)(colorFrameDescription.Width * colorFrameDescription.Height * 4), ColorImageFormat.Bgra); this.colorBitmap.AddDirtyRect(new Int32Rect(0, 0, this.colorBitmap.PixelWidth, this.colorBitmap.PixelHeight)); } this.colorBitmap.Unlock(); } if (_mode == CameraMode.Color) { camera.Source = frame.ToBitmap(); } } } // Depth using (var frame = reference.DepthFrameReference.AcquireFrame()) { if (frame != null) { if (_mode == CameraMode.Depth) { camera.Source = frame.ToBitmap(); } } } // Infrared using (var frame = reference.InfraredFrameReference.AcquireFrame()) { if (frame != null) { if (_mode == CameraMode.Infrared) { camera.Source = frame.ToBitmap(); } } } // Body using (var frame = reference.BodyFrameReference.AcquireFrame()) { if (frame != null) { canvas.Children.Clear(); _bodies = new Body[frame.BodyFrameSource.BodyCount]; frame.GetAndRefreshBodyData(_bodies); foreach (var body in _bodies) { if (body.IsTracked) { // COORDINATE MAPPING foreach (Joint joint in body.Joints.Values) { if (joint.TrackingState == TrackingState.Tracked) { // 3D space point CameraSpacePoint jointPosition = joint.Position; // 2D space point System.Windows.Point point = new System.Windows.Point(); if (_mode == CameraMode.Color) { ColorSpacePoint colorPoint = _sensor.CoordinateMapper.MapCameraPointToColorSpace(jointPosition); point.X = float.IsInfinity(colorPoint.X) ? 0 : colorPoint.X / 2; point.Y = float.IsInfinity(colorPoint.Y) ? 0 : colorPoint.Y / 2; //获取肩肘腕,脊椎中间坐标 switch (joint.JointType) { case JointType.WristLeft: WristLeft.X = point.X; WristLeft.Y = point.Y; break; case JointType.ElbowLeft: ElbowLeft.X = point.X; ElbowLeft.Y = point.Y; break; case JointType.ShoulderLeft: ShoulderLeft.X = point.X; ShoulderLeft.Y = point.Y; break; case JointType.SpineShoulder: SpineShoulder.X = point.X; SpineShoulder.Y = point.Y; break; case JointType.ShoulderRight: ShoulderRight.X = point.X; ShoulderRight.Y = point.Y; break; case JointType.ElbowRight: ElbowRight.X = point.X; ElbowRight.Y = point.Y; break; case JointType.WristRight: WristRight.X = point.X; WristRight.Y = point.Y; break; case JointType.ThumbRight: ThumbRight.X = point.X; ThumbRight.Y = point.Y; break; case JointType.HandLeft: HandLeft.X = point.X; HandLeft.Y = point.Y; break; } } else if (_mode == CameraMode.Depth || _mode == CameraMode.Infrared) // Change the Image and Canvas dimensions to 512x424 { DepthSpacePoint depthPoint = _sensor.CoordinateMapper.MapCameraPointToDepthSpace(jointPosition); point.X = float.IsInfinity(depthPoint.X) ? 0 : depthPoint.X / 2; point.Y = float.IsInfinity(depthPoint.Y) ? 0 : depthPoint.Y / 2; } // Draw 红色圆,直径10 Ellipse ellipse = new Ellipse { Fill = System.Windows.Media.Brushes.Red, Width = 10, Height = 10 }; Canvas.SetLeft(ellipse, point.X - ellipse.Width / 2); Canvas.SetTop(ellipse, point.Y - ellipse.Height / 2); canvas.Children.Add(ellipse); } } DrawHand(body.HandLeftState,HandLeft); lefthandheight = HandLeft.Y; Addangle(lefthandheight,HandLeft); rightshoulderangle = GetAngle(SpineShoulder, ShoulderRight, ElbowRight); rightelbowangle = GetAngle(ShoulderRight, ElbowRight, WristRight); if (elbowrightflag) { DrawingLine(ShoulderRight, ElbowRight);//连接肩肘 DrawingLine(ElbowRight, WristRight);//连接肘腕 //DrawingLine(WristRight, ThumbRight); //计算肘角度并添加到canvas //rightwristangle = GetAngle(ElbowRight,WristRight,ThumbRight); Addangle(rightelbowangle, ElbowRight); //Addangle(rightwristangle, WristRight); } if (shoulderrightflag) { DrawingLine(ShoulderRight, ElbowRight);//连接肩肘 DrawingLine(SpineShoulder, ShoulderRight);//连接肩和肩中 //计算肩角度并添加到canvas Addangle(rightshoulderangle, ShoulderRight); } if (issend) { rightshoulder = Convert.ToInt32(rightshoulderangle+155); rightelbow = Convert.ToInt32(rightelbowangle + 100); lefthigh = Convert.ToInt32(lefthandheight+100); switch (body.HandLeftState) { case HandState.Open: lefthand = 100; break; case HandState.Closed: lefthand = 200; break; case HandState.Lasso: lefthand = 300; break; case HandState.NotTracked: lefthand = 100; break; case HandState.Unknown: lefthand = 100; break; } srightshoulder = Convert.ToString(rightshoulder); srightelbow = Convert.ToString(rightelbow); slefthigh = Convert.ToString(lefthigh); slefthand = Convert.ToString(lefthand); txtStatus.Text = srightelbow; //com.Write($"s{srightshoulder}{srightelbow}{slefthigh}190{slefthand}"); //Thread.Sleep(20); 延时 if (flag == 1) { com.Write("s"); //Thread.Sleep(5); com.Write(srightshoulder); //Thread.Sleep(5); com.Write(srightelbow); flag = 2; } else if (flag == 2) { com.Write(slefthigh); //Thread.Sleep(5); com.Write("190"); flag = 3; } else if (flag == 3) { com.Write(slefthand); //Thread.Sleep(5); flag = 1; } //com.Write("s"); //Thread.Sleep(5); //com.Write($"{srightshoulder}{srightelbow}{slefthigh}190{slefthand}"); //com.Write(srightshoulder); //Thread.Sleep(5); // com.Write(srightelbow); //Thread.Sleep(5); // com.Write(slefthigh); //Thread.Sleep(5); //com.Write("190"); //Thread.Sleep(5); //com.Write(slefthand); // Thread.Sleep(5); } } } } } } 这是一个Kinect程序 其中这个大函数是一个事件触发函数 我用的是wpf 我想将我数据处理的值通过串行口通信发送过去,但是当发送两个数据的时候就会卡死的了,该怎么解决我这个问题?具体的串行口通信代码都在最后面 前面是一些数据的chu'l

关于C#串口接收单片机返回的反馈码

图中的串口测试工具可以接收到一条反馈码,我自己写的winform却接收不到,哪位大神了解串口工具的源码或者知道我的代码怎么改嘛,哪位大神指点一下,万分感谢! int n = sc._serialPort.BytesToRead; StringBuilder builder=new StringBuilder(); byte[] rec = new byte[n]; //新建一个接受数组 sc._serialPort.Read(rec, 0, n); //将串口接收到的数据写入接收数组 //sc.DataReceived(object sender, EventArgs e, rec); builder.Append(Encoding.ASCII.GetString(rec)); 这个是我自己写的,获取不到东西,还有一个是别人提供的写好的 public SerialPort _serialPort = null; //定义委托 public delegate void SerialPortDataReceiveEventArgs(object sender, SerialDataReceivedEventArgs e, byte[] bits); //定义接收数据事件 public event SerialPortDataReceiveEventArgs DataReceived; void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (DataReceived != null) { byte[] _data = new byte[_serialPort.BytesToRead]; _serialPort.Read(_data, 0, _data.Length); DataReceived(sender, e, _data); //a += _data.Length; //rec += System.Text.Encoding.Default.GetString(_data)+_data.Length; } } 可是这两种都接收不到东西,请大神指教一下我应该怎么改写这两个函数或者是怎样写

C#串口通讯,设置的3秒发送一次数据,怎么控制发25次后,休息10秒钟,然后再发送数据,谢谢!!!!

![图片说明](https://img-ask.csdn.net/upload/201907/23/1563852046_647468.png) 已经设定了3秒发一次,怎么控制25次后休息10秒钟,谢谢各位大神的指点!!!

C# 串口接收抛出索引超出数组界限

求助大佬!感谢! 1、只要串口接收到的数据流中存在0x1A,就会抛出“索引超出数组界限”。 2、关键代码如下: ``` private void Form1_Load(object sender, EventArgs e) { sp1.Parity = Parity.None; sp1.BaudRate = int.Parse("9600"); sp1.ReceivedBytesThreshold = 5; //设置触发字节数 //--------------------------------------------------------------------- Control.CheckForIllegalCrossThreadCalls = false; // sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); //串口接收事件 sp1.DtrEnable = true; sp1.RtsEnable = true; sp1.ReadTimeout = 1000; sp1.Close(); } ``` ``` private void button_open_Click(object sender, EventArgs e) { try { sp1.Open(); } catch { sp1.Close(); MessageBox.Show("没有此串口!"); } } ``` ``` void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (sp1.IsOpen) { byte[] byteRead = new byte[sp1.BytesToRead]; //获取串口接收缓冲区中字节数 try { Byte[] receivedData = new Byte[sp1.BytesToRead]; sp1.Read(receivedData, 0, receivedData.Length); this.Invoke(new EventHandler(delegate { textBox1.Text = Convert.ToString(receivedData.Length); })); sp1.DiscardInBuffer(); //clear //------------------------------------------------- if (receivedData[0] == 0xAA && receivedData[1] == 0x55) { string Recostr = string.Empty; if (DataType == 0) Recostr = "Hex: " + arr2string(receivedData, 0, receivedData.Length); else Recostr = "Dec: " + arr2string(receivedData, 0, receivedData.Length); RecodLine = DateTime.Now.ToString("G") + " " + Recostr; this.Invoke(new EventHandler(delegate { listBoxAutoRefesh(RecodLine); })); receok = true; } } catch (System.Exception ex) { sp1.DiscardInBuffer(); MessageBox.Show(ex.Message, "出错提示"); } } } ``` 3、现象截图如下: ![图片说明](https://img-ask.csdn.net/upload/201908/26/1566806558_35429.png) 4、接收数据流验证过百来个字节,经实验,只要数据流中任何位置存在0x1A,都会抛出“索引超出数组界限”异常。

电脑接受两个串口可行吗?

1.没有思路,请问该如何解决这个问题?最好是C#的。 2.你们的解决方法是怎样的

C#读取电子称串口数据,显示在TextBox控件

已经能显示出来数据,但是我应该如何提取数据到textbox中,与电子秤上的重量同步显示![图片说明](https://img-ask.csdn.net/upload/201711/05/1509870414_705074.png)

c#怎么和arduino上的蓝牙进行通信

我想让pc给我的小机器人发消息。我买了个蓝牙适配器和机器人上的蓝牙进行了连接,蓝牙配对成功后 有两个串口, 然后我尝试通过c#的SerialPorts和机器人连接,但失败了,两个都试了了下,报的错误是没找到。求解决方法 这是我的代码 ![图片说明](https://img-ask.csdn.net/upload/201712/11/1512985057_495975.png) ![图片说明](https://img-ask.csdn.net/upload/201712/11/1512984932_778324.png) 输出里也有COM21,但报错 ![图片说明](https://img-ask.csdn.net/upload/201712/11/1512984994_998124.png)

C#对串口发送一条一条读取指令并接收返回对应指令的数据显示在不同的文本框上

我在一个时间控件里面添加代码,但是文本框只显示前一条指令返回的数据 byte[] adr1 = new byte[] { 0x01, 0x03, 0x00, 0x0B, 0x00, 0x04, 0x35, 0xCB };//一号传感器内码 byte[] adr2 = new byte[] { 0x01, 0x03, 0x00, 0x0C, 0x00, 0x04, 0x84, 0x0A };//二号传感器内码 try { //object objIn; //string adrf1=""; axMSComm1.Output = adr1; if (axMSComm1.Input.ToString().Length > 0) { this.label2.Text = axMSComm1.Input.ToString(); axMSComm1.Output = adrZ; if (axMSComm1.Input.ToString().Length > 0) { this.label4.Text = axMSComm1.Input.ToString(); } } else { } } catch (Exception ex) { }

串口程序问题,调试没问题,但是执行时收不到信息,求各位大神解答

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Ports; using System.IO; using System.Threading; public class PortChat { /*参数初始化*/ #region private static byte xor = 0X02; //转义字符 private static string str = ""; private static string strSend = ""; private static string txtReceive = null; //存储接收的一帧字符 static SerialPort Com; //定义串口类 #endregion private static void Main (string[] args) { /* 串口通讯参数配置*/ Com = new SerialPort (); Com.BaudRate = 9600; Com.PortName = "COM3"; Com.DataBits = 8; Com.Open (); StreamReader sr = new System.IO.StreamReader ("1.txt"); //打开根目录中的1.txt文档 str = ""; str = sr.ReadToEnd (); str = str.Trim (); int ilen = str.Length; int m = 0; int ibegin = 0; int f = 0; strSend = ""; ilen = ilen / 14; m = ilen % 14; /* 每帧数据中发送14个字符*/ for ( f = 0; f < ilen; f++ ) { ibegin = f * 14; strSend = str.Substring (ibegin, 14); Send (strSend); Receive (); } } private static void Send (string strSend) { char[] chrData = strSend.ToCharArray (); Byte[] Data = new Byte[chrData.Length + 8]; Data[0] = 0x7E; //帧首 int c = 2; byte result = 0X00; for ( Int32 index = 0; index < chrData.Length; index++ ) { Data[c] = (Byte) chrData[index]; if ( Data[c] == 0X7E ) //判断字符串中是否有帧首 { result = (byte) (Data[c] ^ xor); Data[c] = 0X7D; c++; Data[c] = result; } else if ( Data[c] == 0X7D ) //判断字符串中是否有转义符 { result = (byte) (Data[c] ^ xor); Data[c] = 0X7D; c++; Data[c] = result; } else if ( Data[c] == 0X7F ) //判断字符串中是否有帧尾 { result = (byte) (Data[c] ^ xor); Data[c] = 0X7D; c++; Data[c] = result; } c++; } Data[c++] = 0; Data[c] = 0X7F; //帧尾存储 Data[1] = (byte) (++c); Byte[] SendData = new Byte[c]; for ( int k = 0; k < c; k++ ) { SendData[k] = Data[k]; } int sum = 0; for ( int i = 0; i < SendData.Length - 2; i++ ) { sum += SendData[i]; } SendData[SendData.Length - 2] = (byte) (sum % 2); Com.Write (SendData, 0, SendData.Length); } /* 数据接收函数定义*/ private static void Receive () { byte[] receivedData = new byte[Com.BytesToRead]; //创建接收字节数组 Com.Read (receivedData, 0, receivedData.Length); //读取数据 Com.DiscardInBuffer (); txtReceive = Encoding.Default.GetString (receivedData); Console.WriteLine (txtReceive); //Console.WriteLine ("OK"); } }

Unity 如何解析接收到的串口数据

串口助手上接收到的数据格式为 FC 02 00 00 , 02 表示有两台设备连接, 后面的两个 00 表示各自的速度 成员变量 ``` public int ClientCount = 2; //设备数量 public int[] High2Arr; //高位数组 public int[] SpeedValueArr; //速度数组 public List<byte> listReceive = new List<byte>(); //存储串口数据的数组 ``` 这是读取串口数据的函数 ``` private void readPortData() { try { while ((serialPort.ReadByte()) != null) { byte spDate = Convert.ToByte(serialPort.ReadByte()); listReceive.Add(spDate); ParseReceive(); } } catch (Exception ex) { sysMsg = ex.Message.ToString(); } } ``` 这是解析串口数据的函数 ``` if (listReceive.Count < ClientCount + 2) return; for (int i = 0; i < ClientCount; i++) { High2Arr[i] = (listReceive[listReceive.Count - 1 - i] & 0x00) >> 6;//高两位状态 if (High2Arr[i] == 2) { //高两位等于10=2 :前进 SpeedValueArr[i] = (listReceive[listReceive.Count - 1 - i] & 0x3f);// 低六位速度值 } else if (High2Arr[i] == 3) { //高两位等于11=3 :后退 SpeedValueArr[i] = 0; } else if (High2Arr[i] == 0) { //高两位等于00=0 :闲置静止 SpeedValueArr[i] = 0; } } listReceive.RemoveRange(0, ClientCount + 2); ``` 可是我最后并没有接收到任何的数据,,, 请问这是怎么了 我也不知道为什么我没有C 币, 请见谅

RS232串口DataReceived事件接收2组数据

小弟不才,不是学软件出身,所以做上位机软件也是头一次。 这次单位要求用RS232通信,并接收数据后处理结果。 RS232收到上位机发送的START信号后,首先快速的返回"Ver=XX",然后隔个5秒或6秒(肯定10秒以内)后返回结果"PASS"或"FAIL=XX"。 但是由于两组数据之间间隔时间较长,DataReceived有时会认为第一组数据接收到后就结束,执行后面处理结果的函数,导致最终的结果肯定不对。我怎么保证我能每次都能收到完整的数据? 谢谢!

C# SerialPort的Datareceive事件触发后,BytesToRead的值有时候为零

下位机每隔0.5秒通过串口传25个字节到上位机,串口接收到数据后处理并用zedgraph控件绘制实时曲线图,程序运行几分钟后,Datareceive事件触发后,BytesToRead的值有时候为0,有时是25,也有时是50,界面刷新有时也不是0.5秒。 接收程序: ``` private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { if (mySerialPort.IsOpen) { Thread.Sleep(10); int count = mySerialPort.BytesToRead; byte[] data = new byte[count]; mySerialPort.Read(data, 0, count); if (data[0] == 0x01 && data[1] == 0x03) { this.Invoke(textChanged, data, count); } } } catch (Exception err) { throw err; } } ``` 处理程序: ``` textChanged += new UpdateTextEventHandler(ChangeText); private delegate void UpdateTextEventHandler(byte[] buffer,int m);//定义委托 private event UpdateTextEventHandler textChanged;//定义事件 private void ChangeText(byte[] buffer,int m) //事件处理方法 { s1 = ""; Array.Copy(buffer, 3, float_byte1, 0, 4); Array.Copy(buffer, 8, float_byte2, 0, 4); Array.Copy(buffer, 13, float_byte3, 0, 4); Array.Copy(buffer, 18, float_byte4, 0, 4); temperture[0] = BitConverter.ToSingle(float_byte1, 0); temperture[1] = BitConverter.ToSingle(float_byte2, 0); temperture[2] = BitConverter.ToSingle(float_byte3, 0); temperture[3] = BitConverter.ToSingle(float_byte4, 0); textBox1.Text = temperture[0].ToString(); textBox2.Text = temperture[1].ToString(); textBox3.Text = temperture[2].ToString(); textBox4.Text = temperture[3].ToString(); for (int i = 0; i < m; i++) { s1 += buffer[i].ToString("X2"); s1 += " "; } textBox5.Text = s1.ToString(); if (Curve_Flag == 1) { i++; creatGraph(temperture[j]); } } ``` zedgraph绘图: ``` public void creatGraph(float temp) { double x = (double)i; double y = Convert.ToDouble(temp); list.Add(x, y); myCurve = zedGraphControl1.GraphPane.AddCurve("", list, Color.Red, SymbolType.None); //myCurve.Symbol.Fill = new Fill(Color.Blue);//填充数据点 zedGraphControl1.AxisChange();//画到zedGraphControl1控件中,此句必加 zedGraphControl1.Refresh();//重新刷新 } ```

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Python可以这样学(第四季:数据分析与科学计算可视化)

Python可以这样学(第四季:数据分析与科学计算可视化)

组成原理课程设计(实现机器数的真值还原等功能)

实现机器数的真值还原(定点小数)、定点小数的单符号位补码加减运算、定点小数的补码乘法运算和浮点数的加减运算。

javaWeb图书馆管理系统源码mysql版本

系统介绍 图书馆管理系统主要的目的是实现图书馆的信息化管理。图书馆的主要业务就是新书的借阅和归还,因此系统最核心的功能便是实现图书的借阅和归还。此外,还需要提供图书的信息查询、读者图书借阅情况的查询等

土豆浏览器

土豆浏览器可以用来看各种搞笑、电影、电视剧视频

Java面试题大全(2020版)

发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。 JRE:Java Runtime Environ...

Java8零基础入门视频教程

Java8零基础入门视频教程

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

TTP229触摸代码以及触摸返回值处理

自己总结的ttp229触摸代码,触摸代码以及触摸按键处理

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

网络工程师小白入门--【思科CCNA、华为HCNA等网络工程师认证】

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

java jdk 8 帮助文档 中文 文档 chm 谷歌翻译

JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷

Ubuntu18.04安装教程

Ubuntu18.04.1安装一、准备工作1.下载Ubuntu18.04.1 LTS2.制作U盘启动盘3.准备 Ubuntu18.04.1 的硬盘空间二、安装Ubuntu18.04.1三、安装后的一些工作1.安装输入法2.更换软件源四、双系统如何卸载Ubuntu18.04.1新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列...

快速排序---(面试碰到过好几次)

原理:    快速排序,说白了就是给基准数据找其正确索引位置的过程.    如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.    首先从后半部分开始,如果扫描到的值大于基准数据就让high减1,如果发现有元素比该基准数据的值小(如上图中18&amp;lt...

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

HTML期末大作业

这是我自己做的HTML期末大作业,花了很多时间,稍加修改就可以作为自己的作业了,而且也可以作为学习参考

Python数据挖掘简易入门

Python数据挖掘简易入门

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

C++语言基础视频教程

C++语言基础视频教程

UnityLicence

UnityLicence

软件测试2小时入门

软件测试2小时入门

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

Python数据分析师-实战系列

系列课程主要包括Python数据分析必备工具包,数据分析案例实战,核心算法实战与企业级数据分析与建模解决方案实战,建议大家按照系列课程阶段顺序进行学习。所有数据集均为企业收集的真实数据集,整体风格以实战为导向,通俗讲解Python数据分析核心技巧与实战解决方案。

YOLOv3目标检测实战系列课程

《YOLOv3目标检测实战系列课程》旨在帮助大家掌握YOLOv3目标检测的训练、原理、源码与网络模型改进方法。 本课程的YOLOv3使用原作darknet(c语言编写),在Ubuntu系统上做项目演示。 本系列课程包括三门课: (1)《YOLOv3目标检测实战:训练自己的数据集》 包括:安装darknet、给自己的数据集打标签、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类。 (2)《YOLOv3目标检测:原理与源码解析》讲解YOLOv1、YOLOv2、YOLOv3的原理、程序流程并解析各层的源码。 (3)《YOLOv3目标检测:网络模型改进方法》讲解YOLOv3的改进方法,包括改进1:不显示指定类别目标的方法 (增加功能) ;改进2:合并BN层到卷积层 (加快推理速度) ; 改进3:使用GIoU指标和损失函数 (提高检测精度) ;改进4:tiny YOLOv3 (简化网络模型)并介绍 AlexeyAB/darknet项目。

超详细MySQL安装及基本使用教程

一、下载MySQL 首先,去数据库的官网http://www.mysql.com下载MySQL。 点击进入后的首页如下:  然后点击downloads,community,选择MySQL Community Server。如下图:  滑到下面,找到Recommended Download,然后点击go to download page。如下图:  点击download进入下载页面选择No...

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

董付国老师Python全栈学习优惠套餐

购买套餐的朋友可以关注微信公众号“Python小屋”,上传付款截图,然后领取董老师任意图书1本。

爬取妹子图片(简单入门)

安装第三方请求库 requests 被网站禁止了访问 原因是我们是Python过来的 重新给一段 可能还是存在用不了,使用网页的 编写代码 上面注意看匹配内容 User-Agent:请求对象 AppleWebKit:请求内核 Chrome浏览器 //请求网页 import requests import re //正则表达式 就是去不规则的网页里面提取有规律的信息 headers = { 'User-Agent':'存放浏览器里面的' } response = requests.get

web网页制作期末大作业

分享思维,改变世界. web网页制作,期末大作业. 所用技术:html css javascript 分享所学所得

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

相关热词 c# 开发接口 c# 中方法上面的限制 c# java 时间戳 c#单元测试入门 c# 数组转化成文本 c#实体类主外键关系设置 c# 子函数 局部 c#窗口位置设置 c# list 查询 c# 事件 执行顺序
立即提问
相关内容推荐