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

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

4个回答

if (serialPort1.IsOpen)////****判断串口是否打开****////
{
serialPort1.WriteLine(ML);////****串口写入texbox输入的指令*****/////
richTextBox1.AppendText(receiveString);/////*****串口接收事件****////
Application.DoEvents();
for (int i = 0; i < 32000; i += 100)
{
System.Threading.Thread.Sleep(100);
Application.DoEvents();
}
richTextBox1.ScrollToCaret();////*****richbox,滚动****/////
string filename;
if (SN == "")
{
filename = DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();

            }
            else
            {
                filename = textBox2.Text.Trim();
            }
            FileStream fs = new FileStream(@"log\" + filename + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("GB2312"));//通过指定字符编码方式可以实现对汉字的支持,否则在用记事本打开查看会出现乱码
            sw.Flush();
            sw.BaseStream.Seek(0, SeekOrigin.Begin);
            sw.Write(receiveString);//写入textBox2的内容
            sw.Flush();
            sw.Close();
            fs.Close();
        } 
xietiao0306
_bbbbbb 我想知道的是接受数据的具体过程
2 年多之前 回复

无限读缓冲区直到读完为止,然后拼接。我以前只这么干过。

你们的通信协议呢,不管串口通信还是套接字通信你们最少得设计一个简单的协议吧,比如从哪位字节后开始是数据区,数据区到哪个字节结束,检验位占多少个字节等等

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#串口数据读取不全问题

![正确的NFC贴片值](https://img-ask.csdn.net/upload/201611/30/1480487915_614568.png) 我自己写的值和代码 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();//丢弃接收缓冲区数据 })); } ![图片说明](https://img-ask.csdn.net/upload/201611/30/1480488296_546399.png)

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

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

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

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

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#连接串口接受数据显示问题。很急。

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# 串口问题 怎样精确地每隔10ms读取串口中的数据

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

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# 运用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;

C#串口发送数据问题。

``` private void bntSendFile_Click(object sender, EventArgs e) { string fileName = txtFileName.Text.Trim(); if (fileName == "") { MessageBox.Show("请选择要发送的文件!", "Error"); return; } else { sRead = new StreamReader(fileName,Encoding.Default);//解决中文乱码问题 } timer1.Start(); } //发送文件时钟 private void timer1_Tick(object sender, EventArgs e) { string str1; str1 = sRead.ReadLine(); if (str1 == null) { timer1.Stop(); sRead.Close(); MessageBox.Show("文件发送成功!", "C#串口通讯"); this.toolStripStatusLabel5.Text = ""; return; } byte[] data = Encoding.Default.GetBytes(str1); sp.Write(data, 0, data.Length); this.toolStripStatusLabel5.Text = " 文件发送中..."; } ``` ``` ``` 以上是一段串口发送一个文件里面的内容。 现在需求如下,,, 现在想把文件的内容按照字节分数组,temp[0],temp[1],temp[2].......... 每个数组里面存放258个字节的内容。其中前两个字节是固定的 temp[0]={0xFF+0xB5+256字节_1}, temp[1]={0xFF+0xB6+256字节_2}, temp[2]={0xFF+0xB5+256字节_3}, temp[3]={0xFF+0xB6+256字节_4} temp[4]={0xFF+0xB6+256字节_5} ............................................... 直到所有文里面的所有字节内容发送完毕。结束。

C#中串口通信发送数据问题

串口通信数据发送,除了可用字节数组byte[],还可以用其他的什么吗?

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

本人最近做一个项目时需要把串口接收到的数据进行分析,数据量较大,比如5秒钟保存一次,连续工作一天,本人刚接触c#,串口通讯协议已写好,现在的问题是怎么把数据保存在Excel表格中以便分析?各位大神有没有用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#串口发送数据回复问题。

写了一个串口通信的程序,设计一个协议。 目前我通过C#串口上位机给设备发送一个0xFF 0xB5的命令, 设备会回复 0xFF 0xB5 0x00 的消息显示在接受的textbox中。 然后开始发送下一个消息。 C#怎么判断设备回复了消息,这块代码改怎么写??

C#分段读取excel百万数据问题

各位大神,小弟目前遇到一个问题不知如何处理,希望大神能指导,谢谢!问题是这样,现在我要做一个EXCEL文件上传功能并将EXCEL数据存库,Excel文件分块上传已经解决,EXCEL分段获取数据并存库如何实现,网上查找了好多资料还是没能解决,一次性读取EXCEL的话容易溢出而且很慢,如果能在上传的流中提取数据更好,但是不知道如何实现,所以只能退而求其次,想分段获取EXCEL中的数据并保存,因为上传过程中可能会断网,所以存库的数据要能续传,因为EXCEL数据没有ID,开发工具是VS2015,数据库是SQL2012,能贴出代码更好,小弟水平有限,有思路也不一定会实现,很着急,希望各位大神不吝赐教,谢谢!

C# 串口接收数据处理线程遇到的问题求高手帮助!

C# 串口接收数据处理时遇到队列有值,但报错InvalidOperationException,队列为空的问题。 代码如下:private void dataProcessing() { byte[] data = new byte[2] {0,0}; float sensor_data = 0f;//用来记录转化后的数据 //float data_high8 = 0f; int timerDraw=0; while (true) { if (dataQueue.Count >=2)//dataQueue中数据长度大于2时,进行数据处理 { lock (dataQueue) { **data[1] = (byte)dataQueue.Dequeue();** 在此处出现未处理InvalidOperationException 队列为空的问题 //data_high8 = data[1]; if ((data [1] &240) != 0)//如果高四位不是0,说明数据有误 { MessageBox.Show("数据错误!!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } data[0] = (byte)dataQueue.Dequeue(); sensor_data = BitConverter.ToInt16 (data, 0)*3.3f/4096f ; switch (timerDraw) { case 0: timerDraw++; addToList(sensor_data, list1, List1); break; case 1: timerDraw++; addToList(sensor_data, list2, List2); break; case 2: timerDraw++; addToList(sensor_data, list3, List3); break; case 3: timerDraw++; addToList(sensor_data, list4, List4); break; case 4: timerDraw = 0; addToList(sensor_data, list5, List5); if (List5 .Count /2==maxCount )//已接收完数据 { stopTraining(); } break; } } } } } 非常感谢!!

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

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

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#编写串口数据收发程序,收发频繁,求教多线程处理机制!

![![![![图片说明](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#,如果能给出具体修改代码方法更佳,请大神帮帮忙啊~急!

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

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

软件测试入门、SQL、性能测试、测试管理工具

软件测试2小时入门,让您快速了解软件测试基本知识,有系统的了解; SQL一小时,让您快速理解和掌握SQL基本语法 jmeter性能测试 ,让您快速了解主流来源性能测试工具jmeter 测试管理工具-禅道,让您快速学会禅道的使用,学会测试项目、用例、缺陷的管理、

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

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

捷联惯导仿真matlab

捷联惯导的仿真(包括轨迹仿真,惯性器件模拟输出,捷联解算),标了详细的注释捷联惯导的仿真(包括轨迹仿真,惯性器件模拟输出,捷联解算),标了详细的注释

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

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

图书管理系统(Java + Mysql)我的第一个完全自己做的实训项目

图书管理系统 Java + MySQL 完整实训代码,MVC三层架构组织,包含所有用到的图片资源以及数据库文件,大三上学期实训,注释很详细,按照阿里巴巴Java编程规范编写

玩转Linux:常用命令实例指南

人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。 本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 --------------------------------------------------------------- 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+700元编程礼包。 &nbsp;

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

本课程适合CCNA或HCNA网络小白同志,高手请绕道,可以直接学习进价课程。通过本预科课程的学习,为学习网络工程师、思科CCNA、华为HCNA这些认证打下坚实的基础! 重要!思科认证2020年2月24日起,已启用新版认证和考试,包括题库都会更新,由于疫情原因,请关注官网和本地考点信息。题库网络上很容易下载到。

C++语言基础视频教程

C++语言基础视频培训课程:本课与主讲者在大学开出的程序设计课程直接对接,准确把握知识点,注重教学视频与实践体系的结合,帮助初学者有效学习。本教程详细介绍C++语言中的封装、数据隐藏、继承、多态的实现等入门知识;主要包括类的声明、对象定义、构造函数和析构函数、运算符重载、继承和派生、多态性实现等。 课程需要有C语言程序设计的基础(可以利用本人开出的《C语言与程序设计》系列课学习)。学习者能够通过实践的方式,学会利用C++语言解决问题,具备进一步学习利用C++开发应用程序的基础。

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

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

Python数据挖掘简易入门

&nbsp; &nbsp; &nbsp; &nbsp; 本课程为Python数据挖掘方向的入门课程,课程主要以真实数据为基础,详细介绍数据挖掘入门的流程和使用Python实现pandas与numpy在数据挖掘方向的运用,并深入学习如何运用scikit-learn调用常用的数据挖掘算法解决数据挖掘问题,为进一步深入学习数据挖掘打下扎实的基础。

2020-五一数学建模大赛C类问题饲料加工配比及优化.pdf

2020年,“51”数学建模C类问题,关于饲料配比问题以及加工优化方案。论文采用统计分析,建立了关于饲料加工的多目标优化模型。并利用蒙特卡罗算法对目标函数进行优化,解决了饲料加工质量最优配比问题并进行

MySQL数据库从入门到实战应用

限时福利1:购课进答疑群专享柳峰(刘运强)老师答疑服务 限时福利2:购课后添加学习助手(微信号:csdn590),按消息提示即可领取编程大礼包! 为什么说每一个程序员都应该学习MySQL? 根据《2019-2020年中国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。 使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能! 【课程设计】 在本课程中,刘运强老师会结合自己十多年来对MySQL的心得体会,通过课程给你分享一条高效的MySQL入门捷径,让学员少走弯路,彻底搞懂MySQL。 本课程包含3大模块:&nbsp; 一、基础篇: 主要以最新的MySQL8.0安装为例帮助学员解决安装与配置MySQL的问题,并对MySQL8.0的新特性做一定介绍,为后续的课程展开做好环境部署。 二、SQL语言篇: 本篇主要讲解SQL语言的四大部分数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL,学会熟练对库表进行增删改查等必备技能。 三、MySQL进阶篇: 本篇可以帮助学员更加高效的管理线上的MySQL数据库;具备MySQL的日常运维能力,语句调优、备份恢复等思路。 &nbsp;

navicat简体中文版 绿色版 (64位)

解压后安装navicat,打开navicat执行PatchNavicat即破解成功。可以正常使用啦。

linux“开发工具三剑客”速成攻略

工欲善其事,必先利其器。Vim+Git+Makefile是Linux环境下嵌入式开发常用的工具。本专题主要面向初次接触Linux的新手,熟练掌握工作中常用的工具,在以后的学习和工作中提高效率。

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

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

Python代码实现飞机大战

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

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

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

Qt5.10 GUI完全参考手册(强烈推荐)

本书是Qt中文版的参考手册,内容详尽易懂,详细介绍了Qt实现的各种内部原理,是一本不可多得的参考文献

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

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

设计模式(JAVA语言实现)--20种设计模式附带源码

课程亮点: 课程培训详细的笔记以及实例代码,让学员开始掌握设计模式知识点 课程内容: 工厂模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式、原型模型、代理模式、单例模式、适配器模式 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式 课程特色: 笔记设计模式,用笔记串连所有知识点,让学员从一点一滴积累,学习过程无压力 笔记标题采用关键字标识法,帮助学员更加容易记住知识点 笔记以超链接形式让知识点关联起来,形式知识体系 采用先概念后实例再应用方式,知识点深入浅出 提供授课内容笔记作为课后复习以及工作备查工具 部分图表(电脑PC端查看):

进程监控软件 Performance Monitor中文版

告诉你每个程序现在在做什么,还可以根据你的要求过滤无关的内容。

八数码的深度优先算法c++实现

人工智能的八数码的深度优先算法c++实现

2021考研数学张宇基础30讲.pdf

张宇:博士,全国著名考研数学辅导专家,教育部“国家精品课程建设骨干教师”,全国畅销书《张宇高等数学18讲》《张宇线性代数9讲》《张宇概率论与数理统计9讲》《张宇考研数学题源探析经典1000题》《张宇考

2019 Python开发者日-培训

本次活动将秉承“只讲技术,拒绝空谈”的理念,邀请十余位身处一线的Python技术专家,重点围绕Web开发、自动化运维、数据分析、人工智能等技术模块,分享真实生产环境中使用Python应对IT挑战的真知灼见。此外,针对不同层次的开发者,大会还安排了深度培训实操环节,为开发者们带来更多深度实战的机会。

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

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

2020_五一数学建模_C题_整理后的数据.zip

该数据是我的程序读取的数据,仅供参考,问题的解决方案:https://blog.csdn.net/qq_41228463/article/details/105993051

机器学习实战系列套餐(必备基础+经典算法+案例实战)

机器学习实战系列套餐以实战为出发点,帮助同学们快速掌握机器学习领域必备经典算法原理并结合Python工具包进行实战应用。建议学习顺序:1.Python必备工具包:掌握实战工具 2.机器学习算法与实战应用:数学原理与应用方法都是必备技能 3.数据挖掘实战:通过真实数据集进行项目实战。按照下列课程顺序学习即可! 课程风格通俗易懂,用最接地气的方式带领大家轻松进军机器学习!提供所有课程代码,PPT与实战数据,有任何问题欢迎随时与我讨论。

实用主义学Python(小白也容易上手的Python实用案例)

原价169,限时立减100元! 系统掌握Python核心语法16点,轻松应对工作中80%以上的Python使用场景! 69元=72讲+源码+社群答疑+讲师社群分享会&nbsp; 【哪些人适合学习这门课程?】 1)大学生,平时只学习了Python理论,并未接触Python实战问题; 2)对Python实用技能掌握薄弱的人,自动化、爬虫、数据分析能让你快速提高工作效率; 3)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; 4)想修炼更好的编程内功,优秀的工程师肯定不能只会一门语言,Python语言功能强大、使用高效、简单易学。 【超实用技能】 从零开始 自动生成工作周报 职场升级 豆瓣电影数据爬取 实用案例 奥运冠军数据分析 自动化办公:通过Python自动化分析Excel数据并自动操作Word文档,最终获得一份基于Excel表格的数据分析报告。 豆瓣电影爬虫:通过Python自动爬取豆瓣电影信息并将电影图片保存到本地。 奥运会数据分析实战 简介:通过Python分析120年间奥运会的数据,从不同角度入手分析,从而得出一些有趣的结论。 【超人气老师】 二两 中国人工智能协会高级会员 生成对抗神经网络研究者 《深入浅出生成对抗网络:原理剖析与TensorFlow实现》一书作者 阿里云大学云学院导师 前大型游戏公司后端工程师 【超丰富实用案例】 0)图片背景去除案例 1)自动生成工作周报案例 2)豆瓣电影数据爬取案例 3)奥运会数据分析案例 4)自动处理邮件案例 5)github信息爬取/更新提醒案例 6)B站百大UP信息爬取与分析案例 7)构建自己的论文网站案例

相关热词 aero c# c#压缩图片 c# udp服务器 100线程 c# c# fidller请求 c# 参数 调用exe c# 打字母小游戏 c#显示未能加载文件 c# 右击菜单加快捷键 c#将重复的数据保留一条
立即提问