下面是我的串口接收程序的一部分:
Select Case MSComm1.CommEvent'事件发生
Case 2
inbuff = MSComm1.Input '读入到缓冲区
ll = UBound(inbuff)
Label10.Caption = Label10.Caption + UBound(inbuff) + 1
ReDim indata(1 To (ll + 1))
For ii = 0 To UBound(inbuff)
strHex = strHex &Right("0" &Hex(inbuff(ii)), 2) &" " '如果只有一个字符,则前补0, 如F显示0F,最后补空格方便显示观察如: 00 0F FE
TextReceive = strHex ‘显示到 文本框
Next ii
Open "12.txt" For Append As #1 ‘打开 文本文件
m = (ll + 1) / 2
Print #1, Now"收到"m"个数据"
Close #1
For ii = 1 To Len(strHex) Step 6
indata((ii + 5) / 6) = Val("&H" &Mid(strHex, ii, 2)) * 4 + Val("&H" &Mid(strHex, ii + 3, 2))
Next ii
n1 = Val(Text1.Text) '电源电压
n2 = Val(Text2.Text) '第一路电压衰减倍数
n3 = Val(Text3.Text) '第二路电压衰减倍数
na = n1 * n2 / 1024
nb = n1 * n3 / 1024
X = (ll + 1) / 2 - 1
For ii = 1 To X Step 2 '存入文本中,每行两个数据
V1 = indata(ii) * na
V2 = indata(ii + 1) * nb
V3 = Format(V1, "0.000")
V4 = Format(V2, "0.000")
Open "12.txt" For Append As #1
Print #1, ii &"电压 " &V3 &" v " &(ii + 1) &"电压 " &V4 &" v"
Close #1
Next
'写入EXCEL表格中
Set xlsApp = New Excel.Application
Set xlsBook = xlsApp.Workbooks.Open(App.Path &"\Book3.xls")
Set xlsSheet = xlsBook.Worksheets(1)
range = 2 '第二列为起始列,但每次写入时,range并不一定是2,而是在原有基础上另起1列
'第一列,写入奇数数据
Do Until xlsSheet.Cells(2, range) = ""
range = range + 1
Loop
xlsSheet.Cells(1, range) = Date '第1行
xlsSheet.Cells(2, range) = Time '第2行
xlsSheet.Cells(3, range) = "回路1电压(V)" '第3 行
For ii = 1 To X Step 2 '从第4行开始存数据
V1 = indata(ii) * na
V3 = Format(V1, "0.000")
xlsSheet.Cells((ii + 1) / 2 + 3, range) = V3 '第4行
Next ii
'另起一列,写入偶数数据
Do Until xlsSheet.Cells(2, range) = ""
range = range + 1
Loop
xlsSheet.Cells(2, range) = Time '第2行
xlsSheet.Cells(3, range) = "回路2电压(V)" '第3行
For ii = 2 To X + 1 Step 2 '从第4行开始存数据
V2 = indata(ii) * nb
V4 = Format(V2, "0.000")
xlsSheet.Cells(ii / 2 + 3, range) = V4
Next ii
xlsBook.Save
xlsBook.Application.Quit
strHex = "" '处理完成后清空字符串,等待下一次接收
'TextReceive = ""
End Select
姓名:赵宗明
学号:19021211230
【嵌牛导读】:STM32 串口通信 数据包
【嵌牛鼻子】:利用电脑端发送数据包至单片机,单片机进行数据解析
【嵌牛提问】:串行接口是连接单片机和PC机的一种简单方式。单片机一个字节是如何收发的?一串数据是如何收发的?
【嵌牛正文】:
单片机数据包的接收以及解析的基础是明白单片机一个数据是如何接收的。查阅Datasheet我们得到如下串口传输时序:
以上时序所说明的是串口发送一帧数据(一个字节)的时序图,时序图中串口发送的格式为:起始位(1bit)+数据位(8bit)+停止位(1bit)。
首先我们电脑端发送一个有效数据的数据格式为:‘空格’+ ‘元素号’+‘:’+‘数据’(例:“0:12 1:24 2:48 3:64”),格式如下所示
电脑串口将数据发送至单片机RX端,单片机该如何接收数据呢,再次查询单片机Datasheet,我们可以发现单片机串口中断这个功能,它每当接收一帧数据(8bit有效数据)就会进入一次中断,所以我们可以利用串口中断进行数据的解析。比如电脑端发送“空格+索引号+‘:’+‘1’+‘2’”。串口中断就会进入5次,我们就可以利用这4次中断分别提取有效数据的索引号和有效数据。我们可以利用状态机的方法来进行数据的解析,例如:
空格检测:第一次进入中断我们检测是否接受到了空格。检测到空格则下一帧数据我们检测数据所索引号,如果没接测到空格下一帧我们继续检测空格。
索引号提取:上一帧数据为空格时,这一帧直接将接收的数据赋值给提前定义好的数据索引号,并且下一帧准备检测冒号。
冒号检测:这一帧数据到来,检测所接收的数据是否为冒号,如果为冒号,则下一帧数据将提取有效数据。如果不是冒号,则将索引号置0 而且下一帧数据将重新从头开始检测空格。
数据提取:上一帧数据接收为冒号时,这一帧数据将接收的数据赋值给提前定义好的有效数据变量。
经过以上检测就会提取一组接收的有效数据。稳定而且不会出错。
一下为具体实现方法:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)