ESP8266 串口接收数据,当接收的数据中包含0xFF的时候,这个字节后的数据会被分成两次接收,如何解决? 5C

ESP8266 串口接收随机数据,当接收的数据中包含0xFF的时候,这个字节后的数据有时候被分开,由于我发现了其实是触发两次 uart_recvTask(os_event_t *events) _这个函数来处理数据,由此实际上是触发了两次接收中断

例如我往ESP8266的串口发送
01 02 03 FF FF 00 37 12 53 75 12 73 57 12 FF FF 52 73 57 12 53 71 25 73 01 0F
这样子一组26个byte数据

然后ESP8266可能只接收到 01 02 03 FF 然后再次触发uart_recvTask(os_event_t *events) _来接收剩下的数据

这种情况不是每次都会发生,有时候会分成两次接收数据,有时候能一次性的接收完成的数据

这种问题该如何解决?

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何接收串口数据
读卡器在超级终端读到的数据是“1900AB37E2”,要怎么样才能用vb接收到这个数据呢rn
如何接收串口数据?
请问串口来的数据,我要用什么类型的变量来接收?最后一定要变成string,因为我要对它操作!rn请各位帮忙给出实际的源码!
ESP8266 串口接收 串口中断接收 NONOS_SDK-2.2.0_UART_MQTT.rar
ESP8266 串口接收 中断处理,基于官方 MQTT DEMO修改,整个工程打包,可以直接使用
接收串口的数组数据不正确如何解决??
---begindrn/****************这是数据类************/rn private byte[] testw;//写rn public byte[] testr;//读rnrnrn //发送数据rn public short SetParameter(byte addr, byte value, byte ReaderAddr)rn rn short result = -1;rn tryrn rn this.testw = new byte[8];rn this.testw[0] = 0xAA;rn this.testw[1] = ReaderAddr;rn this.testw[2] = 5;rn this.testw[3] = CMD.PID_GET_PARAMETER;rn this.testw[5] = addr;rn this.testw[6] = value;rn this.testw[this.testw.Length - 1] = this.Last(this.testw);rn this.spt.Write(this.testw, 0, this.testw.Length);//串口自身的方法发送数据rn result = 0;rn rn catch (Exception ex)rn rn MessageBox.Show(ex.Message);rn rn return result;rn rnrn //由 DataReceived 事件接收数据rn private void spt_DataReceived(object sender, SerialDataReceivedEventArgs e)rn rn tryrn rn this.spt.BaseStream.Flush();rn int j = this.spt.BytesToRead;rn testr = new byte[j];rn this.spt.Read(testr, 0, j);//把数据读入数组中rn this.spt.BaseStream.Flush();rn rn catch (Exception ex)rn rn MessageBox.Show(ex.Message);rn this.spt.BaseStream.Close();rn rn rnrnrn/****************这是测试类************/rn byte[] test;rn //把上面的数据类创建对象,下面调用方法rn UserControl1 uc = new UserControl1();rn private void button2_Click(object sender, EventArgs e)rn rn tryrn rn short k = 0;rn k = uc.DrfCommOpen("COM1"); //这是打开串口的方法,已经成功rn if (k == 0)rn rn k = uc.SetParameter(0xC1, 20, 0xFF);//这个是问题的所在rn if (k == 0)rn rn test = testr; //把数据类的数组传给本类的数组rn this.label2.Text = "";rn foreach (byte rr in test)rn rn this.label2.Text += rr.ToString() + " ";rn rn rn rn rn catch (Exception ex)rn rn MessageBox.Show(ex.Message);rn rn rn---endrnrn前提,所有硬件都正常连接并工作。rn可是有一个很奇怪的问题,串口监测工具(如AccessPort、串口调试助手等)明明显示有数据返回,也就是说数据类的testr数组已经存有数据了,可是测试类的test数组接收的东西却不相符,具体情况是这样的,第1次点击按钮时,引发异常数组超出下标,第2次点击按钮才读到正确的东西,也就是说要点击2次按钮才能得到数据,这样的现象不正常。请问高手该如何解决此问题,第一次接触串口的开发,请诸位多指教。
VFP如何接收串口数据
我有一台秤,要通过串口接收数据,请教大侠如何接收,查询了很多资料,始终未搞定,请高手指教在线等,谢谢!!
C#接收串口数据
基于C# winform,建立监听线程,读取串口数据
串口数据怎么接收????????
接收的数据是二进制,以68开头,以16结尾,中间部分长度不固定,谁能告诉我怎么接收?rn以前是这么写的:rnPrivate Sub MSComm1_OnComm()rnrn With MSComm1rn Select Case .CommEventrn Case comEvReceivern ReDim ab(60) As Bytern .RThreshold = 0rn TimeDelay 300 '等0.3秒,rn av = .Input 'av为变体rn ab = av ’ab为byte数组rn .InBufferCount = 0 ’清空rn .OutBufferCount = 0 '清空rn End Selectrn .RThreshold = 1 rn End WithrnEnd Subrn中间用了延时,现在想不用延时,直接用看数据是不是16,是就结束,但不知道怎么写。
串口数据接收简单算法
前言:工作中经常会用到串口数据接收,多数串口数据接收比较简单而且通用,正好今天用到了,写下留存。 实例: 我们这里跳过串口波特率等的设置,直接到数据接收方法。 此处模拟串口数据长度76,头码0xff //每次缓存的数据都会增加,把数据加在数组的末尾     byte[] tempBuffer = new byte[3000]; int ...
串口数据接收
我需要接收下位机的一个34字节的数据,协议就是mscomm1.Settings = "9600,n,8,1"我用下边的代码接收,发现有的时候会有一次数据接收到没有解析出来,可能是接收的时候有问题。所以想在群里请教高手给指点下,要是这样接收34字节的数据,什么样的接收方式比较好,不会出现接收错误。谢谢(对方一共发3遍,每遍的间隔为20ms。)rnSelect Case MSComm1.CommEventrn Case comEvReceivern MSComm1.RThreshold = 0rn m = Timerrn While Timer - m < 0.038 '从0.01到0.02(20sm)做延时rn Wendrn inByte = MSComm1.Inputrn rn For i = 0 To UBound(inByte)rn If Len(Hex(inByte(i))) = 1 Thenrn str1 = 0 & Hex(inByte(i))rn Text14 = str1rn Elsern str1 = Hex(inByte(i))rn Text15 = str1rn End Ifrn strData = strData & str1rn Text16 = strDatarn Nextrn End Selectrn MSComm1.RThreshold = 1rnrn我目前Mscomm1的设置如下rn With MSComm1rn .CommPort = 1rn .Settings = "9600,n,8,1"rn .InBufferCount = 0rn .InputLen = 0rn .RThreshold = 0 rn .InputMode = comInputModeBinary '以2进制接收rn .PortOpen = Truern End With
接收串口数据问题!!
写串口和读串口之间,Sleep(100)的话,接收串口数据没有问题。rn写串口和读串口之间,不Sleep的话,则接收不到串口数据。rn觉得用Sleep的话很机械,如果把波特率提高了的话,就不需要Sleep(100),可能需要Sleep(10),rn如果仍然Sleep(100)的话,则影响接收速度。一条数据基本没有影响,如果是百万条的话,差距就大了。rnrn有没有这样的办法,写串口之后,等待数据1秒钟,1秒以内如果有数据返回,则开始接收,如果1秒以内没有数据返回,则return.rn写串口省略给出,读串口代码详细给出,请指教。rnrn新手,求详细方法,代码,多谢。rnrn[code=C/C++]rn 先 WriteFile( m_hIDComDev,Date, wLength, &dwBytesWritten, &m_OverlappedWrite );rn 再 Sleep(100);rnrn 然后接收:rn BOOL bReadStatus;rn DWORD dwBytesRead; rn DWORD dwErrorFlags;rn COMSTAT ComStat;rn char tempbuffer[1]=0;rn CString buffer;rn ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );rn if( !ComStat.cbInQue ) return( 0 );rnrn dwBytesRead = (DWORD) ComStat.cbInQue;rn dorn bReadStatus = ReadFile( m_hIDComDev, tempbuffer, 1, &dwBytesRead, &m_OverlappedRead );rn if(bReadStatus)buffer+=tempbuffer[0];rn Sleep(1);rn while( dwBytesRead ==1); rnrn if( !bReadStatus )rn if( GetLastError() == ERROR_IO_PENDING )rn WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );rn return( (int) dwBytesRead );rn rn return( 0 );rn rn[/code]
串口数据接收的问题
在调试状态串口数据可以正常接收处理数据,直接执行的时候接收数据变得很慢,发送端是以80ms每帧数据在发送,另外用串口调试软件模拟定时发送数据时都可以正常处理,但是和真实设备通信的时候就接收数据变得很慢了
串口数据接收问题
大家好 现在我有一个问题 就是用串口接收传感器一个一个发送过来的数据 总计数据量是800,如何保证能完整正确的读取这800个数据呢,我通过设置c_cc[VTIME],c_cc[VMIN]两个控制字符 循环读取800次 可以满足要求 可是 这样效率太低了 不能满足系统要求 改用select机制 读取数据错误,不知道哪位可以指点一下 最好详细些 多谢
c++接收串口数据
c++接收串口数据的程序 很实用 很强大
关于串口数据接收
最近在用labwindows编写一个串口数据采集的程序,有个问题想请教大家。rnrn仪器通过串口发送数据到计算机。由于发送的数据并不是连续的,我如何知道计算机已经接收到数据?rnrn新手在线等!rn
接收串口数据
接收串口数据 打开串口 发送命令 接收串口返回值
串口数据的接收
sp.Write(SendSumCheck("$2#"));rn while (!reTwo)rn rn rn reTwo = false;rn MessageBox.Show("XXXX");rnreTwo这个变量我在串口DataReceive这个事件中将他置为True,但是进入循环后一直读while,读到reTwo=true;这语句之前就不往下读了,这是怎么回事?令人费解rnrn之前也有个这样的循环,是reOne变量,我之前在主线程调用这个函数时也出现这个问题,我另起线程后reOne能跳出while循环,但接下来的reTwo就出现了同样的问题。。rnrn有个小小疑问,串口的DataReceive事件难道不是单开线程接收的吗?
串口接收不到数据
串口和单片机通信,以前可以接收到数据,最近收不到了;有时调试的时候commevent值为2 ,可以看到input里面有数据,但是用一个string字符串取出来后就什么都没有了;有时 Select Case MSComm1.CommEvent可以看到有数据返回,经过case Input 里面的数据就变为空的,这是怎么回事,要怎么解决;有时候也不触发commevent事件rnPrivate Sub Combo1_Click()rnDim Portstr As StringrnDim keywords As StringrnDim tmp As LongrnDim ret As LongrnDim I, JJ As IntegerrnrnPortstr = Combo1.TextrnFor JJ = 1 To Len(Portstr)rnIf Asc(Mid(Portstr, JJ, 1)) >= 48 And Asc(Mid(Portstr, JJ, 1)) <= 57 Thenrncomport = comport & Mid(Portstr, JJ, 1)rnElsernI = I + Val(comport)rncomport = ""rnEnd IfrnNextrnrn MSComm1.CommPort = comportrn MSComm1.settings = "9600,n,8,1" '设置串口1的参数rn MSComm1.InputMode = comInputModeBinary '接收二进制数据rn MSComm1.InBufferSize = 2048rn MSComm1.RThreshold = 1 ' MSComm1.Input = 0rn MSComm1.InputLen = 0rn MSComm1.OutBufferCount = 0rn MSComm1.InBufferCount = 0rn If MSComm1.PortOpen = False Thenrn MSComm1.PortOpen = True '打开通信端口rn MsgBox ("端口已打开")rn Elsern MsgBox ("请重新选择端口号"), 16rn End Ifrnrn If MSComm1.PortOpen = True Thenrn ret = mySearching(BROADCAST, 0)rn If ret >= 0 Thenrn Shape1.FillColor = vbGreenrn End Ifrn End IfrnEnd SubrnrnPrivate Sub MSComm1_OnComm()rnDim J As LongrnDim I As Integerrn Select Case MSComm1.CommEventrn Case 2rn strBuff = MSComm1.Inputrn BytReceived() = strBuffrn rnFor I = 0 To UBound(BytReceived)rnPrint BytReceived(I)rnNextrn jieshourn '数据处理代码rn End SelectrnEnd Sub
关于接收串口数据
我使用MSComm控件通过串口接受单片机发出的数据rn一条完整数据包含4个16进制数(范围0~255)第一个为标志位rn第二、三位是我要分析的数据,最后一位为缓冲位rn这是我原来可以用的程序~~现在看起来觉得有点不对rn怎样写更好呢?rnDim Buffer As VariantrnDim sj(3) As Bytern‘设置串口部分略rnIf comEvReceive = MSComm1.CommEvent Thenrn Buffer = MSComm1.Input '接受数据对应到缓冲rn If Buffer(0) = Hex(255) Then '标识位数值正确时进一步判断rn sj(0) = Buffer(0)rn sj(1) = Buffer(1)rn sj(2) = Buffer(2)rn sj(3) = Buffer(3)rn Else: Buffer = MSComm1.Input '标识位数值错误时重置rn sj(0) = 0rn sj(1) = 0rn sj(2) = 0rn sj(3) = 0rn End IfrnIF sj(1)=Hex(1) ......
接收串口数据工具
一般串口工具接收速度高时容易死掉,这个不会。 需先在超级终端中设置好波特率,然后关掉超级终端,打开ComR可接收
串口数据接收处理
串口接收函数只需要管理数据的接收就行了,不必管理相应数据接收的是什么,还有顺序对不对,真正寻找数据的地方是在数据处理的地方。void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { if(esp8266_cnt >= sizeof(esp8266_buf
串口数据的接收问题
串口参数设置为:9600,e,7,2rnrn从pc上位机发送一命令给下位机,正常应返回65个字符(字母+数字),我在程序中延时了100毫秒才接收,现在的情况是有时能完全接收,有时又不能完全接收,会丢掉几个字符,按理每秒钟应该可以接收1200字符,100毫秒应该可以接收120个字符,延时100毫秒接收65个字符应该完全不成问题的啊,这是为什么?rnrn后来我把延时改为110毫秒就没问题了。rn
js接收串口数据
&amp;lt;html&amp;gt; &amp;lt;head&amp;gt; &amp;lt;title&amp;gt;JavaScript串口测试&amp;lt;/title&amp;gt;&amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=GB2312&quot; /&amp;gt;&amp;lt;SCRIPT   ID=clientEventHandlersJS   LANGUAG
串口的数据接收问题
各位前辈,小弟刚开始学习C#,碰到一个问题几天没有解决了,特来求助rnusing System;rnusing System.Collections.Generic;rnusing System.ComponentModel;rnusing System.Data;rnusing System.Drawing;rnusing System.Linq;rnusing System.Text;rnusing System.IO.Ports;rnusing System.IO;rnusing System.Threading.Tasks;rnusing System.Windows.Forms;rnrnnamespace _0705_1352rnrn public partial class Form1 : Formrn rn public Form1()rn rn InitializeComponent();rn rnrn private void button_open_Click(object sender, EventArgs e)rn rn serialPort1.PortName = "COM6";rn serialPort1.BaudRate = 115200;rn serialPort1.DataBits = 8;rn serialPort1.StopBits = System.IO.Ports.StopBits.One;rn serialPort1.Parity = System.IO.Ports.Parity.None;rnrn serialPort1.Open();rn rnrn private void button_close_Click(object sender, EventArgs e)rn rn if (serialPort1.IsOpen)rn serialPort1.Close();rn rnrn private void textBox1_TextChanged(object sender, EventArgs e)rn rnrn rnrn private void textBox2_TextChanged(object sender, EventArgs e)rn rnrn rnrn private void button_send_Click(object sender, EventArgs e)rn rn string str1 = "VE10\rEG200\rFL2000\rWT0.1\r";rnrn serialPort1.Write(str1);rn string str2 = "FL1000\rWT0.5\rFL-3000\r";rnrn serialPort1.Write(str2);rnrnrnrnrn rnrnrnrn rnrn rnrn这是一个集成式伺服电机的控制程序rn我将命令写进程序里面,不用手动输入,但是想知道从伺服电机他的返回值,不知道该怎么修改?rn跪求赐教rn
C#串口数据的接收
问题:当按下button按钮之后,开始连接到串口读取数据,rn如果不按停止按钮,则一直读取串口数据,数据如([color=#FF0000]05 06[/color] [color=#3366FF]FF[/color])之类的,前面05 06表示地址,后面FF表示测试数据,rn需要将地址记录下来,如string add0= 05 06(这种数据类型的处理也不清楚,希望大家指教),add1=,add2=....,(这些地址我要用到控件的加载,不同地址加载不同的控件)。rn对于串口在网上查看了资料,现在有点乱,还请指教。rn我自己写的一点程序如下,请指教:rnprivate void toolStripButton1_Click(object sender, EventArgs e)rn rn sp.PortName = "COM1";rn sp.BaudRate = 38400;rn sp.Open();//连接串口rn string address = sp.ReadLine();//读取缓冲区数据 //需要循环??rn string addx = address.Substring(0,2);rn string temp = address.Substring(2,1);
C#串口数据接收
本源代码是在win7下利用vs2010开发的C#串口接收数据界面,类似于串口助手。上传的是完整的工程文件。
串口数据接收不同步?
用mscomm控件串口接收,数据1秒一组,20个字节。头两个字节为固定号码,每个单片机有不同的号码。用旋转开关切换不同的单片机接收时,虽然收到20个字节,但是次序错了,头两个字节不是固定号码,跑到后面去了。要么重启串口或是旋转开关几次后又正确了,这个问题一直得不到彻底解决,希望能有高手帮助!!!rnrn
串口数据发送 接收
用串口调试助手 每隔50ms发送数据 发送200多次的时候,大概会出现7、8次没有数据返回 这样正常吗
C#串口通信中如何接收串口的数据
刚刚学习C#串口通信,不知道怎么接收数据,从网上查了的代码页看不懂,那个朋友可以帮帮忙rnserialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);这句是什么意思
c++中如何接收串口的数据?
c++中如何接收串口的数据?rn求个代码看看,emal:hujob@hotmail.com 或者直接贴在下面也行
ReadFile函数在接收串口数据的时候,怎么设置成逐个接收?
大家好,我是新手程序员,我遇到了一个难题,就是串口通讯的问题,我用ReadFile函数进行接收串口数据,是由一个线程来监控的,ReadFile函数原型是ReadFile(hComm,buf,512,&dwLength,NULL),它接收的方式是接收一个数据包,假如我要发送的数据是一个数据包为“40 23 01 01 04 01”,它接收的方式是把这个整体放在buf里 然后一起显示,我不想这样,我现在想把它换成接收一个数据就返回一次,比如发送“40 23 01 01 04 01”,这个数据包,当它接收“40”的时候就读出,一个一个的读,这样我就可以判断文件头尾了,如果第一个数是“40”我就继续往下接收,否则就丢掉。我的这个函数是这样的:rnrn DWORD WINAPI ReadPortThread(LPVOID lpvoid)rnrn BOOL fReadState;rn CSerialPortDlg *pDlg = (CSerialPortDlg*)lpvoid;rn DWORD dwLength;rn unsigned char* buf=new unsigned char[512];rnrn while(hComm!=INVALID_HANDLE_VALUE)rn rn rn if (hComm != INVALID_HANDLE_VALUE)rn /* 从串口读取数据 */rn BOOL fReadState = ReadFile(hComm,buf,512,&dwLength,NULL);rn if(!fReadState)rn rn //MessageBox(_T("无法从串口读取数据!"));rn rn elsern rn if(dwLength != 0)rn pDlg->OnCommRecv(pDlg, buf, dwLength); /* 接收成功调用回调函数 */rn rn rn rnrn求大神帮助!
ESP8266 —— 高效的串口接收模板
本代码是在ESP8266_RTOS_SDK_V1.5.0基础上修改的,ESP8266_RTOS_SDK_V1.5.0在哪儿能下载,请在我博客里寻找下载链接~ #include "esp_common.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #inclu...
QT解决串口数据接收不完整问题
使用QT编写串口上位机时,串口通信的过程中有时会遇到数据接收不完整的问题,下位机一次发送的数据可能会分为两次甚至多次接收,这样就导致数据接收不完整,解决方案如下:void MainWindow::Read_Data()//读取数据函数,只要串口中有数据,就会进入这个函数 { static QByteArray buf;//QByteArray 类是定义一个字节数组(char *) 一定...
解决Linux下串口数据接收不全的异常问题
1、引言     最近在Linux下调试串口程序,遇到了串口数据接收不全的异常问题,经过将近一上午的努力终于找到问题根源,特此分享给大家,此次调试过程中用到了主要用到了minicom工具,至于minicom的使用大家可以自行查找相关资料。 2、正文     此次调试环境实在两个平台下,负责发送串口数据一方是VxWorks平台,负责接收的一方是arm+Linux平台,发送的是一些必要的时间和其...
数据接收问题:串口数据接收不完整,什么原因呢?
通过工具连续发送数据一段时间后,停止500ms,然后再发一串数据。rn停止500ms之后,再发送的数据系统就收不到了啊。rnrn反复测试,这个问题一直存在。rnrn请高手指点。rnrnc# serialportrnusb转串口。
.NET 串口数据接收问题
C#中自带的串口类  SerialPort 需要添加引用: using System.IO.Ports; 在数据接收过程中,由于这样或那样的问题,导致从串口发来的数据并不是同时达到的。 因此接收到的数据就不是完整的。为了让数据接收具有完整性,需要在接收数据的方法中进行判断可用数据字节的长度 private void SerialPortOnDataReceived(object s...
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview