c#串口数据读取不全问题

正确的NFC贴片值
我自己写的值和代码
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
System.Threading.Thread.Sleep(100);//延时100ms等待接收完数据

        // this.Invoke就是跨线程访问ui的方法


        this.Invoke((EventHandler)
            (delegate
        {
            if (isHex == false)
            {
                tbxRecvData.Text += sp.ReadLine();
            }
            else
            {
                Byte[] ReceivedData = new Byte[sp.BytesToRead];
                sp.Read(ReceivedData, 0, ReceivedData.Length);
                String RecvDataText = null;
                for (int i = 0; i < ReceivedData.Length; i++)
                {
                    RecvDataText += (" " + ReceivedData[i].ToString("X2") + "");
                }
                tbxRecvData.Text += RecvDataText;
            }
            sp.DiscardInBuffer();//丢弃接收缓冲区数据
        }));
    }

图片说明

1个回答

图片说明

a839398
a839398 Thread.Sleep(500)插在sp.Read(ReceivedData, 0, ReceivedData.Length);后面
大约一年之前 回复
crazyman_gao
善心的cat 只是因为ACISS有些符号在页面不显示的问题么? 16进制的数显示是全的
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C#串口数据读取问题求助

用C#中的一个serialport类读取cc2431传感器通过usb(com口)传来的数据,程序代码如下 void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 received_count += n;//增加接收计数 comm.Read(buf, 0, n);//读取缓冲数据 builder.Clear();//清除字符串构造器的内容 //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判断是否是显示为16禁止 if (checkBoxHexView.Checked) { //依次的拼接出16进制字符串 foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,并滚动到最后。 this.txGet.AppendText(builder.ToString()); //修改接收计数 labelGetCount.Text = "Get:" + received_count.ToString(); })); } 会读取到如下数据71 09 FC 08 00 F1,而实际上用配套的串口调试助手得到的一串数据时这样的:04 C0 E0 D8 27 3B 03 23 4D 80 03 B0 02 00 4C 00 40 7F C0 4C 32 32 00 42 24 FF 不知道程序哪里应该改动,才能得到同串口调试助手一样的数据

C#串口读取较大的数据的问题

向下位机发送一条指令,会返回一串数据,数据比较大,可能有几十K,不确定具体大小,上位机怎么接受到完整的数据并保存到本地,求助。

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

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

C#实时读取串口数据的问题

假设有7条命令,向串口发送命令,待数据接收完成后触发下一条命令的发送,就这样循环一直发送。问题是:向串口发送命令后,我该怎样判断数据接收完成,从而发送下一条命令

C# 串口问题 怎样精确地每隔10ms读取串口中的数据

我想每隔10ms读取一次传感器产生的数据,传感器是通过采集器然后输出为串口形式的。我是这样做的:利用线程每隔10ms发送一次读取命令,然后在DataReceived事件中利用serialPort.read()进行读取,同时利用dateTime.Now.Millisceond为每条读取的记录标记时间戳,最后存储在列表中。但发现列表中每条记录的时间间隔不是10ms,有两条记录时间间隔很大的情况出现,同时也有一条记录包含多条返回数据的情况, 请高手们指点,为什么出现这种情况,我想每隔10ms利用串口接收传感器的数据应该怎么写呢?

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#串口接收数据问题,怎么在处理数据前判断数据接收完毕

上位机接收数据格式如下: 0x53 0x50 0x01 0x01 0x00 0x00 0x00 0x00 0x57 0x23 0x7F 0x3F 0xA6 0xFC 0xBF 0x3A 0x11 0x07 0x17 0x11 0x13 0x39 其中 53 50是包头,后面是有效数据,我现在想把0x00 0x00 0x00 0x00 0x57 0x23 0x7F 0x3F 0xA6 0xFC 0xBF 0x3A 这几个字节分别转化为三个浮点数,但是问题是,我现在无法判断数据是否接收完毕,及完整的一个数据包。 注:通过按下一次单片机上的“确定键”,单片机给上位机发送一次数据,数据格式如上描述。请大家指点下,谢谢! 我是通过绑定串口接收事件实现的,但这样会多次触发串口接收事件,主要卡在数据接收和数据以浮点数显示环节,代码如下: private void sp_DataReceived(object sender,SerialDataReceivedEventArgs e) { if (isHex==true) { string str; uint i=0; int bufferlen = sp.BytesToRead; byte[] bytes = new byte[bufferlen]; sp.Read(bytes, 0, bufferlen); for(i=0;i<bytes.Length;i++) { str= Convert.ToString((byte)bytes[i], 16).ToUpper(); tbxRecvData.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " "); } } else { int bufferlen = sp.BytesToRead; byte[] bytes = new byte[bufferlen]; sp.Read(bytes, 0, bufferlen); string gb = System.Text.Encoding.Default.GetString(bytes); tbxRecvData.AppendText(gb); } }

C#winform串口接收数据不能换行

![串口数据发送程序](https://img-ask.csdn.net/upload/201705/27/1495894317_580025.png) 下位机发送的是字符串数组;一共发送三个数组,间隔10ms左右,每个数组发送完成后添加"\r\n"换行; ![上位机接收显示程序](https://img-ask.csdn.net/upload/201705/27/1495894387_353263.png) C#winform上位机接收串口数据后显示到textbox控件中; ![上位机显示情况](https://img-ask.csdn.net/upload/201705/27/1495894251_237664.png) 理想的情况是要数据单列显示,便于保存到excel。但是在下位机添加"\r\n"后,依旧不能保证每次接收到的数据都自成一行。 请问这是什么原因?具体能怎么解决呢? (PS:利用开发板商的工具能够稳定的单列显示)

C#编写串口数据收发程序,收发频繁,求教多线程处理机制!

![![![![图片说明](https://img-ask.csdn.net/upload/201604/20/1461167601_434062.jpg)图片说明](https://img-ask.csdn.net/upload/201604/20/1461167592_877283.jpg)图片说明](https://img-ask.csdn.net/upload/201604/20/1461167576_770964.jpg)图片说明](https://img-ask.csdn.net/upload/201604/20/1461167565_101017.jpg)C#编写串口数据收发程序,点击界面按钮发送指令数据,等待接收返回的数据,此外还有周期性数据需要不断接收;接收到的数据要判断重复帧和是否是最后一帧,然后去掉帧头帧尾并显示在界面控件内;目前程序开了三个线程:接收、处理、发送,三个线程都是一直循环判断指针是否有更新,但这样导致界面切换太卡,请问该怎么处理这三个线程之间的关系才能使界面切换流畅呢,初学C#,如果能给出具体修改代码方法更佳,请大神帮帮忙啊~急!

c#串口通信延迟问题,数据的发送和接受

在vs2010中调试运行,功能都完整,为什么在debug下运行exe文件。功能就会出现问题 自己认为是接受数据的时候发生了延迟。 comm_DataReceived 接受代码: int n = serialPort1.BytesToRead; byte[] buf = new byte[n]; serialPort1.Read(buf, 0, n); buffer.AddRange(buf); if (!isDataReceived) { buffer.Clear(); isDataReceived = false; bindControlDetail(); } else { if (buffer.Count == 9) { if (buffer[0] == 0xee && buffer[1] == 0xff) { //byte[] binary_data_1 = new byte[9]; buffer.CopyTo(0, binary_data_1, 0, 9); reader = CommonUtil.CommonUtil.byteToHexStr(binary_data_1); buffer.Clear(); analysisRuningTimeControlData();//解析 } } if (buffer.Count > 9) { buffer.Clear(); } } 请教各位大神,帮忙看看!!!!

请问各位大神,在c#串口通讯中,怎么把接收到的数据保存在Excel表格中?

本人最近做一个项目时需要把串口接收到的数据进行分析,数据量较大,比如5秒钟保存一次,连续工作一天,本人刚接触c#,串口通讯协议已写好,现在的问题是怎么把数据保存在Excel表格中以便分析?各位大神有没有用C#做过项目,求指教,最好有源代码!本人刚进论坛,没分,如果满意的话以后再补给你!!!!!!!!!急!!!!!!

c# 运用serialport与PLC串口通讯,读取(例如D200)的数据

网上下的 c# 运用serialport与PLC串口通讯程序,小白看不太懂下的程序,求大神帮忙分析下,主要想知道程序中的tebox1、textbox4、textbox5、textbox6、textbox7分别对应图中哪个空,对应的空应填写什么,例如想读取三菱F3X系列PLC D200的数据,初始地址填200?那设备地址和长度填啥? 界面如下:![图片说明](https://img-ask.csdn.net/upload/201806/14/1528961750_92350.png) 主要程序如下: private void btn_open_Click(object sender, EventArgs e) { int nSelect; btn_open.Enabled = false; Object selectedItem = cbxCOMPort.SelectedItem; sp.PortName = selectedItem.ToString();//串口 selectedItem = cbxBaudRate.SelectedItem; sp.BaudRate = int.Parse(selectedItem.ToString());//波特率 nSelect = cbxDataBits.SelectedIndex;//数据位 switch (nSelect) { case 0: sp.DataBits = 8; break; case 1: sp.DataBits = 7; break; case 2: sp.DataBits = 6; break; case 3: sp.DataBits = 5; break; } nSelect = cbxParity.SelectedIndex; switch (nSelect) { case 0: sp.Parity = Parity.None; break; case 1: sp.Parity = Parity.Odd; break; case 2: sp.Parity = Parity.Even; break; case 3: sp.Parity = Parity.Mark; break; case 4: sp.Parity = Parity.Space; break; } nSelect = cbxStopBits.SelectedIndex; switch (nSelect) { case 0: sp.StopBits = StopBits.None; break; case 1: sp.StopBits = StopBits.One; break; case 2: sp.StopBits = StopBits.OnePointFive; break; case 3: sp.StopBits = StopBits.Two; break; } sp.Open(); btn_close.Enabled = true; } private void btn_send_Click(object sender, EventArgs e) { textBox1.Text = ""; int n = 6; byte[] buf = new byte[n]; string ee = textBox4.Text; buf[0] = Convert.ToByte(ee); if (comboBox1.Text == "3X") { buf[1] = Convert.ToByte(3); } else { buf[1] = Convert.ToByte(4); } if (int.Parse(textBox5.Text) <= 255) { buf[2] = Convert.ToByte(0); buf[3] = Convert.ToByte(int.Parse(textBox5.Text)); } else { if (Convert.ToString(int.Parse(textBox5.Text), 16).Length < 4) { int b = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(0, 1), 16); buf[2] = Convert.ToByte(b); int c = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(1, 2), 16); buf[3] = Convert.ToByte(c); } else { int b = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(0, 2), 16); buf[2] = Convert.ToByte(b); int c = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(2, 2), 16); buf[3] = Convert.ToByte(c); } } if (int.Parse(textBox6.Text) <= 255) { buf[4] = Convert.ToByte(0); buf[5] = Convert.ToByte(int.Parse(textBox6.Text)); } else { if (Convert.ToString(int.Parse(textBox6.Text), 16).Length < 4) { int d = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(0, 1), 16); buf[4] = Convert.ToByte(d); int f = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(1, 2), 16); buf[5] = Convert.ToByte(f); } else { int d = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(0, 2), 16); buf[4] = Convert.ToByte(d); int f = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(2, 2), 16); buf[5] = Convert.ToByte(f); } } p = int.Parse(textBox6.Text) * 2 + 5; byte[] buf1 = new byte[n + 2]; byte[] ReturnData = new byte[2]; ReturnData = CRC16_C(buf); for (int i = 0; i < n; i++) { buf1[i] = buf[i]; } buf1[n] = ReturnData[1]; buf1[n + 1] = ReturnData[0]; sp.Write(buf1.ToArray(), 0, n + 2); } void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = sp.BytesToRead; byte[] TxData = new byte[n];//声明一个临时数组存储当前来的串口数据 sp.Read(TxData, 0, n); //读取缓冲数据 m = m + n; this.Invoke((EventHandler) (delegate { Array.Resize(ref TxData2, m);//改写数组大小 TxData.CopyTo(TxData2, m - TxData.Length); if (m == p) { byte[] data = new byte[p - 2]; for (int i = 0; i < TxData2.Length - 2; i++) { data[i] = TxData2[i]; } byte[] data2 = new byte[2]; data2[0] = TxData2[TxData2.Length - 2]; data2[1] = TxData2[TxData2.Length - 1]; byte[] data1 = new byte[2]; data1 = CRC16_C(data); if (data1[0] == data2[1] && data1[1] == data2[0]) { for (int j = 3; j <= m - 4; j = j + 2) { string s1 = TxData2[j].ToString(); string s2 = TxData2[j + 1].ToString(); string s = s1 + s2; int g = Convert.ToInt32(s, 10); string h = g.ToString(); textBox1.Text += h + " "; } textBox7.Text = "读取成功"; } else { textBox7.Text = "读取失败"; } m = 0; } } ) ); } public byte[] CRC16_C(byte[] data) { byte CRC16Lo; byte CRC16Hi; byte CL; byte CH; byte SaveHi; byte SaveLo; byte[] tmpData; int Flag; CRC16Lo = 0xFF; CRC16Hi = 0xFF; CL = 0x01; CH = 0xA0; tmpData = data; for (int i = 0; i < tmpData.Length; i++) { CRC16Lo = (byte)(CRC16Lo ^ tmpData[i]); for (Flag = 0; Flag <= 7; Flag++) { SaveHi = CRC16Hi; SaveLo = CRC16Lo; CRC16Hi = (byte)(CRC16Hi >> 1); CRC16Lo = (byte)(CRC16Lo >> 1); if ((SaveHi & 0x01) == 0x01) { CRC16Lo = (byte)(CRC16Lo | 0x80); } if ((SaveLo & 0x01) == 0x01) { CRC16Hi = (byte)(CRC16Hi ^ CH); CRC16Lo = (byte)(CRC16Lo ^ CL); } } } byte[] ReturnData = new byte[2]; ReturnData[0] = CRC16Hi; ReturnData[1] = CRC16Lo; return ReturnData;

MFC中读取串口时数据总是不全,请问各位大侠有什么方式可以全部读好,谢谢了

我采用的是异步方式事件触发的形式读取串口数据,采用的是readfile函数,ReadFile(hCom, lpInBuffer,dwBytesRead, NULL,&m_osRead); 但是总是读不全就开始处理数据了,读不全的意思是,我原本打算每秒接收到数据是2k左右(接收的数据不是固定的),但是可能接收到100B或者200B就开始处理了,请问有什么方式可以实现全部收到后再处理。还有,我们没有对COMMTIMEOUTS读写超时设置,请问有必要设置么?谢谢各位了

C#写串口通信程序接收数据没有反应是怎么回事啊??

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ChuanKou2 { public partial class Form1 : Form { SerialPort sp = null; //声明串口类 bool isOpen = false; //打开串口标志 bool isSetProperty = false; //属性设置标志 bool isHex = false; //十六进制显示标志位 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.MaximumSize = this.Size; this.MinimumSize = this.Size; this.MaximizeBox = false; for (int i=0;i<10;i++) { cbxCOMPort.Items.Add("COM" + (i + 1).ToString()); } } private void btnCheckCOM_Click(object sender, EventArgs e) //检测有哪串口 { bool comExistence = false; //是否有可用的串口 cbxCOMPort.Items.Clear(); //清除当前串口号中的所有串口名称 for(int i=0;i<10;i++) { try { SerialPort sp = new SerialPort("COM" + (i + 1).ToString()); sp.Open(); sp.Close(); cbxCOMPort.Items.Add("COM" + (i + 1).ToString()); comExistence = true; } catch (Exception) { continue; } } if (comExistence) { cbxCOMPort.SelectedIndex = 0;//使ListBox显示第一个添加的索引 } else { MessageBox.Show("没有找到可用串口!","错误提示"); } } private bool CheckPortSetting() //串口是否设置 { if (cbxCOMPort.Text.Trim() == "") return false; if (cbxBaudRate.Text.Trim() == "") return false; if (cbxDataBits.Text.Trim() == "") return false; if (cbxParitv.Text.Trim() == "") return false; if (cbxStopBits.Text.Trim() == "") return false; return true; } private bool CheckSendData() { if (tbxSendData.Text.Trim() == "") return false; return true; } private void SetPortProPerty() //设置串口属性 { sp = new SerialPort(); sp.PortName = cbxCOMPort.Text.Trim(); //串口名 sp.BaudRate = Convert.ToInt32(cbxBaudRate.Text.Trim());//波特率 float f = Convert.ToSingle(cbxStopBits.Text.Trim());//停止位 if (f == 0) { sp.StopBits = StopBits.None; } else if (f == 1.5) { sp.StopBits = StopBits.OnePointFive; } else if (f == 1) { sp.StopBits = StopBits.One; } else if (f == 2) { sp.StopBits = StopBits.Two; } else { sp.StopBits = StopBits.One; } sp.DataBits = Convert.ToInt16(cbxDataBits.Text.Trim());//数据位 string s = cbxParitv.Text.Trim(); //校验位 if (s.CompareTo("无") == 0) { sp.Parity = Parity.None; } else if (s.CompareTo("奇校验") == 0) { sp.Parity = Parity.Odd; } else if (s.CompareTo("偶校验") == 0) { sp.Parity = Parity.Even; } else { sp.Parity = Parity.None; } sp.ReadTimeout = -1; //设置超时读取时间 sp.RtsEnable = true; //定义DataReceived事件,当串口收到数据后触发事件 sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); if (rbnHex.Checked) { isHex = true; } else { isHex = false; } } private void sp_DataReceived(object sender,SerialDataReceivedEventArgs e) { System.Threading.Thread.Sleep(100); //延时100ms等待接收数据 //this.Invoke 跨线程访问ui的方法 this.Invoke((EventHandler)(delegate { if (isHex == false) { tbxRecvData.Text += sp.ReadLine(); } else { Byte[] ReceivedData = new Byte[sp.BytesToRead]; sp.Read(ReceivedData, 0, ReceivedData.Length); String RecvDataText = null; for(int i = 0; i < ReceivedData.Length - 1; i++) { RecvDataText += ("0x" + ReceivedData[i].ToString("X2") + ""); } tbxRecvData.Text += RecvDataText; } sp.DiscardInBuffer(); //丢弃接收缓冲区数据 })); } private void btnSend_Click(object sender, EventArgs e) //发送数据 { if (isOpen) { try { sp.WriteLine(tbxSendData.Text); } catch(Exception) { MessageBox.Show("发送数据时发生错误!", "错误提示"); return; } } else { MessageBox.Show("串口未打开", "错误提示"); return; } if (!CheckSendData()) { MessageBox.Show("请输入要发送的数据!", "错误提示"); return; } } private void btnOpenCom_Click(object sender, EventArgs e) { if (isOpen == false) { if (!CheckPortSetting()) //检测串口设置 { MessageBox.Show("串口未设置!", "错误提示"); return; } if (!isSetProperty) //串口未设置则设置串口 { SetPortProPerty(); isSetProperty = true; } try { sp.Open(); isOpen = true; btnOpenCom.Text = "关闭串口"; //串口打开后则相关串口设置按钮便不可再用 cbxCOMPort.Enabled = false; cbxBaudRate.Enabled = false; cbxDataBits.Enabled = false; cbxParitv.Enabled = false; cbxStopBits.Enabled = false; rbnChar.Enabled = false; rbnHex.Enabled = false; } catch (Exception) { //打开串口失败后,相应标志位取消 isSetProperty = false; isOpen = false; MessageBox.Show("串口无效或已被占用!", "错误提示"); } } else { try //关闭串口 { sp.Close(); isOpen = false; btnOpenCom.Text = "打开串口"; //关闭串口后,串口设置选项可以继续使用 cbxCOMPort.Enabled = true; cbxBaudRate.Enabled = true; cbxDataBits.Enabled = true; cbxParitv.Enabled = true; cbxStopBits.Enabled = true; rbnChar.Enabled = true; rbnHex.Enabled = true; } catch (Exception) { MessageBox.Show("关闭串口时发生错误!", "错误提示"); } } } private void btnCleanData_Click(object sender, EventArgs e) { tbxRecvData.Text = ""; tbxSendData.Text = ""; } } }

如何用c#编写串口监控软件? 监控某个串口的数据接受和发送

例如:有个串口工具在和COM3通信,可以用 串口监控软件,监控它们的通信数据。 我用过serialPort试过,但serialPort.Open()打开后,其他串口工具就无法和COM3连接,提示被占用,如何解决即可以监控串口,但又不影响其他工具连接COM3进行通信。 AccessPort 串口监控工具可以实现这个功能,但不知道其怎么实现的,我需要把这个功能加到我自己的代码里面。

C# USB转串口程序问题

现在是这样,我正在学C#,想先学学上位机程序,决定从串口通讯开始学习; 我手上有个施耐德和ABB的PLC,我准备用电脑走MODBUS/RTU通讯来控制PLC; 但是现在我发现我的电脑上没有串口,即在设备管理器里面看不到端口这个栏目,没有COM口; 我记得我以前调试MODBUS/RTU通讯的时候,有用到一个USB转串口的线,然后用一个串口调试助手来实现数据截取;我很疑惑这个程序是不是从USB端口里面拿的数据,即数据经过USB转串口线,然后程序读取USB内的数据,在展现出来; 那么问题来了,我现在是继续寻找发掘现在电脑的串口在哪里,继续走开发串口的路子; 还是用USB转串口这样,从USB口走数据,然后自己写一个串口调试工具这样

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

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

怎么用c#编程不断的从串口接收数据并显示在textbox上,新手求帮助

如题,怎么用c#编程不断的从串口接收数据并显示在textbox上,新手求帮助

C#串口通信高速向下位机发送数据出现内存不断增加

using System; using System.Linq; using System.Collections.Generic; using System.Text; using System.IO.Ports; using System.Windows.Forms; namespace MSPCS { /// <summary> /// 通讯端口,用于和上位机通讯 /// 上行与下行使用同一种格式: /// /* 同步头 6 Byte EB90EB90EB90H 设备地址 1 Byte DevAddr 长度 1 Byte (N+2) 命令码 1 Byte CmdCode 数据区 N Byte DATA(1),..,DATA(N) 校验码 1 Byte 累加和求余(除FF) * * 00H 数据接收正确(下行) 01H 数据接收错误(下行) 02H 取测量值 03H 取参数 04H 设置参数 05H 设置时间 06H 设备异常码(下行) 7FH 设备状态正常(上行) */ /// <summary> /// 端口类 /// </summary> public class ComPort : SerialPort, IDisposable { public event EventHandler<ComDataEventArgs> NewSerialDataRecieved; public event EventHandler TimeOutHandler; public event EventHandler Receiving; public event EventHandler ReceiveFinish; public event EventHandler Uploading; public event EventHandler UploadFinish; static byte[] ErrorCode = { 0xEB, 0x90, 0xEB, 0x90, 0xEB, 0x90, 0x00, 0x00, 0x7F }; #region 构造函数 public ComPort() : base() { Init(); } public ComPort(System.ComponentModel.IContainer container) : base(container) { Init(); } private void Init() { base.PortName = "COM2"; base.BaudRate = 9600; base.DataBits = 8; base.StopBits = StopBits.One; base.Parity = Parity.None; base.ReadTimeout = SerialPort.InfiniteTimeout; base.ReadBufferSize = 1024; base.WriteBufferSize = 512; base.WriteTimeout = 1000; base.DataReceived += new SerialDataReceivedEventHandler(OnDataReceived); } #endregion #region Methods /// <summary> /// 开始监听 /// </summary> public void StartListening() { try { if (!this.IsOpen) // 如果端口没有打开,就打开 { this.Open(); } } catch { MessageBox.Show("上位机通讯端口错误!", "SPC工作站", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1); } } #endregion /// <summary> /// 读取消息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void OnDataReceived(object sender, SerialDataReceivedEventArgs e) { try { if (null != Receiving) { // Receiving(sender, null); } //byte[] data = new byte[base.BytesToRead]; //base.Read(data, 0, base.BytesToRead); //同步头 6 Byte EB90EB90EB90H //设备地址 1 Byte DevAddr //长度 cton 1 Byte (N+2) byte[] dataInfo = new byte[8]; dataInfo[0] = Convert.ToByte(base.ReadByte()); if (0xEB != dataInfo[0]) { base.DiscardInBuffer(); dataInfo = null; return; } dataInfo[1] = Convert.ToByte(base.ReadByte()); if (0x90 != dataInfo[1]) { base.DiscardInBuffer(); dataInfo = null; return; } dataInfo[2] = Convert.ToByte(base.ReadByte()); if (0xEB != dataInfo[2]) { base.DiscardInBuffer(); dataInfo = null; return; } dataInfo[3] = Convert.ToByte(base.ReadByte()); if (0x90 != dataInfo[3]) { base.DiscardInBuffer(); dataInfo = null; return; } dataInfo[4] = Convert.ToByte(base.ReadByte()); if (0xEB != dataInfo[4]) { base.DiscardInBuffer(); dataInfo = null; return; } dataInfo[5] = Convert.ToByte(base.ReadByte()); if (0x90 != dataInfo[5]) { base.DiscardInBuffer(); dataInfo = null; return; } base.Read(dataInfo, 6, dataInfo.Length - 6); // base.Read(dataInfo, 0, dataInfo.Length); int len = Convert.ToInt32( dataInfo[7] ); if (len > 0) { byte[] data = new byte[8 + len]; dataInfo.CopyTo(data,0); for (int i = 0; i < len; i++) { data[8 + i] = Convert.ToByte( base.ReadByte() ); } base.DiscardInBuffer(); if (NewSerialDataRecieved != null) { NewSerialDataRecieved(this, new ComDataEventArgs(data)); } if (null != ReceiveFinish ) { ReceiveFinish(sender, null); } } } catch //(Exception ex) { if (null != TimeOutHandler) { TimeOutHandler(this, null); } return; // MessageBox.Show("获取端口数据错误:" + ex.Message); //if (NewSerialDataRecieved != null) //{ // NewSerialDataRecieved(this, new ComDataEventArgs(ErrorCode)); //} } } #region /// <summary> /// 发送数据 /// </summary> /// <param name="result"></param> public void SendData(byte[] result) { try { if (null != Uploading) { Uploading(this, null); } base.DiscardOutBuffer(); base.Write(result, 0, result.Length); if (null != UploadFinish) { UploadFinish(this, null); } } catch(Exception ex) { base.DiscardOutBuffer(); MessageBox.Show(ex.Message); } } #endregion } /// <summary> /// 数据读取消息事件 /// 把二进制值转化为测量结果。 /// </summary> public class ComDataEventArgs : EventArgs { public ComDataEventArgs(byte[] data) { Request = data; } /// <summary> /// Byte array containing data from serial port /// </summary> public byte[] Request; } } 应用程序是在CE系统上运行的,用10ms间隔重复发送数据,CE任务管理器显示内存不断增加,CPU100%。一直发送到最后,程序会卡死。注释掉 base.DataReceived += new SerialDataReceivedEventHandler(OnDataReceived);就跟程序刚启动一样了,任务管理器显示的情况一样了,只是耗了小部分内存。求大牛指点。

程序员的兼职技能课

获取讲师答疑方式: 在付费视频第一节(触摸命令_ALL)片头有二维码及加群流程介绍 限时福利 原价99元,今日仅需39元!购课添加小助手(微信号:csdn590)按提示还可领取价值800元的编程大礼包! 讲师介绍: 苏奕嘉&nbsp;前阿里UC项目工程师 脚本开发平台官方认证满级(六级)开发者。 我将如何教会你通过【定制脚本】赚到你人生的第一桶金? 零基础程序定制脚本开发课程,是完全针对零脚本开发经验的小白而设计,课程内容共分为3大阶段: ①前期将带你掌握Q开发语言和界面交互开发能力; ②中期通过实战来制作有具体需求的定制脚本; ③后期将解锁脚本的更高阶玩法,打通任督二脉; ④应用定制脚本合法赚取额外收入的完整经验分享,带你通过程序定制脚本开发这项副业,赚取到你的第一桶金!

Windows版YOLOv4目标检测实战:训练自己的数据集

课程演示环境:Windows10; cuda 10.2; cudnn7.6.5; Python3.7; VisualStudio2019; OpenCV3.4 需要学习ubuntu系统上YOLOv4的同学请前往:《YOLOv4目标检测实战:训练自己的数据集》 课程链接:https://edu.csdn.net/course/detail/28745 YOLOv4来了!速度和精度双提升! 与 YOLOv3 相比,新版本的 AP (精度)和 FPS (每秒帧率)分别提高了 10% 和 12%。 YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用labelImg标注和使用YOLOv4训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv4使用AlexyAB/darknet,在Windows系统上做项目演示。包括:安装软件环境、安装YOLOv4、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算)和先验框聚类分析。还将介绍改善YOLOv4目标检测性能的技巧。 除本课程《Windows版YOLOv4目标检测实战:训练自己的数据集》外,本人将推出有关YOLOv4目标检测的系列课程。请持续关注该系列的其它视频课程,包括: 《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》 《Windows版YOLOv4目标检测实战:中国交通标志识别》 《Windows版YOLOv4目标检测:原理与源码解析》

lena全身原图(非256*256版本,而是全身原图)

lena全身原图(非256*256版本,而是全身原图) lena原图很有意思,我们通常所用的256*256图片是在lena原图上截取了头部部分的256*256正方形得到的. 原图是花花公子杂志上的一个

快速入门Android开发 视频 教程 android studio

这是一门快速入门Android开发课程,顾名思义是让大家能快速入门Android开发。 学完能让你学会如下知识点: Android的发展历程 搭建Java开发环境 搭建Android开发环境 Android Studio基础使用方法 Android Studio创建项目 项目运行到模拟器 项目运行到真实手机 Android中常用控件 排查开发中的错误 Android中请求网络 常用Android开发命令 快速入门Gradle构建系统 项目实战:看美图 常用Android Studio使用技巧 项目签名打包 如何上架市场

Java调用微信支付

Java 使用微信支付 一. 准备工作 1.

汽车租赁管理系统需求分析规格说明书

汽车租赁管理系统需求分析规格说明书,这只是一个模板,如果有不会的可以借鉴一下,还是蛮详细的。。。。

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

程序员的算法通关课:知己知彼(第一季)

【超实用课程内容】 程序员对于算法一直又爱又恨!特别是在求职面试时,算法类问题绝对是不可逃避的提问点!本门课程作为算法面试系列的第一季,会从“知己知彼”的角度,聊聊关于算法面试的那些事~ 【哪些人适合学习这门课程?】 求职中的开发者,对于面试算法阶段缺少经验 想了解实际工作中算法相关知识 在职程序员,算法基础薄弱,急需充电 【超人气讲师】 孙秀洋&nbsp;| 服务器端工程师 硕士毕业于哈工大计算机科学与技术专业,ACM亚洲区赛铜奖获得者,先后在腾讯和百度从事一线技术研发,对算法和后端技术有深刻见解。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/27272 移动端:CSDN 学院APP(注意不是CSDN APP哦) 本课程为录播课,课程无限观看时长,但是大家可以抓紧时间学习后一起讨论哦~

机器学习初学者必会的案例精讲

通过六个实际的编码项目,带领同学入门人工智能。这些项目涉及机器学习(回归,分类,聚类),深度学习(神经网络),底层数学算法,Weka数据挖掘,利用Git开源项目实战等。

Python入门视频精讲

Python入门视频培训课程以通俗易懂的方式讲解Python核心技术,Python基础,Python入门。适合初学者的教程,让你少走弯路! 课程内容包括:1.Python简介和安装 、2.第一个Python程序、PyCharm的使用 、3.Python基础、4.函数、5.高级特性、6.面向对象、7.模块、8.异常处理和IO操作、9.访问数据库MySQL。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

我以为我对Mysql事务很熟,直到我遇到了阿里面试官

太惨了,面试又被吊打

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

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

Java62数据提取代码

利用苹果手机微信下面的wx.data文件提取出62数据,通过62可以实现不同设备直接登陆,可以通过文件流的方式用脚本上传到服务器进行解析

Python代码实现飞机大战

文章目录经典飞机大战一.游戏设定二.我方飞机三.敌方飞机四.发射子弹五.发放补给包六.主模块 经典飞机大战 源代码以及素材资料(图片,音频)可从下面的github中下载: 飞机大战源代码以及素材资料github项目地址链接 ————————————————————————————————————————————————————————— 不知道大家有没有打过飞机,喜不喜欢打飞机。当我第一次接触这个东西的时候,我的内心是被震撼到的。第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机, 每

2018年全国大学生计算机技能应用大赛决赛 大题

2018年全国大学生计算机技能应用大赛决赛大题,程序填空和程序设计(侵删)

Lena图像处理测试专业用图,高清完整全身原图

Lena图像处理测试专业用图,高清完整全身原图,该图片很好的包含了平坦区域、阴影和纹理等细节,这些都有益于测试各种不同的图像处理算法。它是一幅很好的测试照片!其次,由于这是一个非常有魅力女人的照片。

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

verilog实现地铁系统售票

使用 verilog 实现地铁售票

Python+OpenCV计算机视觉

Python+OpenCV计算机视觉系统全面的介绍。

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

董付国老师系列教材《Python程序设计(第2版)》(ISBN:9787302436515)、《Python可以这样学》(ISBN:9787302456469)配套视频,在教材基础上又增加了大量内容,通过实例讲解numpy、scipy、pandas、statistics、matplotlib等标准库和扩展库用法。

150讲轻松搞定Python网络爬虫

【为什么学爬虫?】 &nbsp; &nbsp; &nbsp; &nbsp;1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到! &nbsp; &nbsp; &nbsp; &nbsp;2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 &nbsp; 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑

获取Linux下Ftp目录树并逐步绑定到treeview

在linux下抓取目录树,双击后获取该节点子节点(逐步生成)。另外有两个类,一个是windows下的(一次性获取目录树),一个是linux下的(足部获取目录树)

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项目。

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

【超实用课程内容】 本课程演示的是一套基于Java的SSM框架实现的图书管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的java人群。详细介绍了图书管理系统的实现,包括:环境搭建、系统业务、技术实现、项目运行、功能演示、系统扩展等,以通俗易懂的方式,手把手的带你从零开始运行本套图书管理系统,该项目附带全部源码可作为毕设使用。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/27513 移动端:CSDN 学院APP(注意不是CSDN APP哦) 本课程为录播课,课程2年有效观看时长,大家可以抓紧时间学习后一起讨论哦~ 【学员专享增值服务】 源码开放 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化

微信小程序开发实战之番茄时钟开发

微信小程序番茄时钟视频教程,本课程将带着各位学员开发一个小程序初级实战类项目,针对只看过官方文档而又无从下手的开发者来说,可以作为一个较好的练手项目,对于有小程序开发经验的开发者而言,可以更好加深对小程序各类组件和API 的理解,为更深层次高难度的项目做铺垫。

Java 最常见的 200+ 面试题:面试必备

这份面试清单是从我 2015 年做了 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有那些知识点是我不知道的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平。虽然我是从 2009 年就开始参加编程工作了,但我依旧觉得自己现在要学的东西很多,并且学习这些知识,让我很有成就感和满足感,那所以何乐而不为呢? 说回面试的事,这份面试...

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

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

三个项目玩转深度学习(附1G源码)

从事大数据与人工智能开发与实践约十年,钱老师亲自见证了大数据行业的发展与人工智能的从冷到热。事实证明,计算机技术的发展,算力突破,海量数据,机器人技术等,开启了第四次工业革命的序章。深度学习图像分类一直是人工智能的经典任务,是智慧零售、安防、无人驾驶等机器视觉应用领域的核心技术之一,掌握图像分类技术是机器视觉学习的重中之重。针对现有线上学习的特点与实际需求,我们开发了人工智能案例实战系列课程。打造:以项目案例实践为驱动的课程学习方式,覆盖了智能零售,智慧交通等常见领域,通过基础学习、项目案例实践、社群答疑,三维立体的方式,打造最好的学习效果。

微信小程序 实例汇总 完整项目源代码

微信小程序 实例汇总 完整项目源代码

基于西门子S7—1200的单部六层电梯设计程序,1部6层电梯

基于西门子S7—1200的单部六层电梯设计程序,1部6层电梯。 本系统控制六层电梯, 采用集选控制方式。 为了完成设定的控制任务, 主要根据电梯输入/输出点数确定PLC 的机型。 根据电梯控制的要求,

相关热词 c#设计思想 c#正则表达式 转换 c#form复制 c#写web c# 柱形图 c# wcf 服务库 c#应用程序管理器 c#数组如何赋值给数组 c#序列化应用目的博客园 c# 设置当前标注样式
立即提问