1. 串口通信数据连续性,该怎么处理
串口通信数据连续性 初学串口编程,使用VC6的MSComm控件实现上位机串口通信,接收来自单片机发送来的30个字符,通信设置成了收到一个字节触发事件,发现上位机软件虽然能够接收到所有字符,但是显示格式并连续(回车换行),而我的本意是接收到这30个字符后在后边加入回车换行,但是现在是接收到字符后(<30),就触发事件进入串口接收响应了,所以就在接收到的字符后加了回车换行。用串口调试工具就没有这种现象。请给些修改建议! ------解决方案-------------------------------------------------------- 正常就是你这么做的,至于你说的串口助手自动"知道"你要通信30个字符并"自动"换行,这可能是凑巧了,你把串口助手窗口变小试试,看看是不是还是接收到30个字符自动换行,或者你改成单片机发5个数据或其它个数的数据试试,看看串口助手能不能知道你实际通信的个数 ------解决方案-------------------------------------------------------- 串口工具之所以接收到一定字节数据后自动换行,是因为串口工具的文本模式下,将换行控制的接收字符,“自动”转换为界面的控制符号,故有此效果。 所以在任何应用程序中,如果想达到同样效果,需要了解你单片机串口通讯协议中数据主体模式, 提取并识别串口数据的“回车换行”符,并针对界面输出的换行需要,编程实现这个功能。 串口是流概念,想要分行,必须在更上层的位置将流整理成数据。
2. 串口接收数据如何处理
通过串口收到一串16进制 02 2B 30 30 31 35 34 30 30 31 42 03
02代表开始 2B代表正数
30 30 31 35 34 30 代表仪表数据
30 31 42 暂不做处理
03 代表结束
我需要将收到的16进制 处理成如下显示
textbox1.text= 内显示“正常”
textbox2.text= 内 “正数”
textbox3.text= 内显示001540
textbox4.text= 内显示“结束”
3. 如何实现串口数据采集,如何分析这些数据
MSCOMM控件在VB6的企业版中有,需通过部件添加方式加载。
Private Sub MSComm_OnComm()
Dim bytInput() As Byte
Dim intInputLen As Integer
Select Case frmMain.ctrMSComm.CommEvent
Case comEvReceive
If blnReceiveFlag Then
If Not frmMain.ctrMSComm.PortOpen Then
frmMain.ctrMSComm.CommPort = intPort
frmMain.ctrMSComm.Settings = strSet
frmMain.ctrMSComm.PortOpen = True
End If
'此处添加处理接收的代码
frmMain.ctrMSComm.InputMode = comInputModeText '按ASCII接收
intInputLen = frmMain.ctrMSComm.InBufferCount
ReDim bytInput(intInputLen)
bytInput = frmMain.ctrMSComm.Input
Text1 = bytInput
Text2 = Text1
jscd = Len(Text1)
If Left(Text1, 1) <> Chr(27) Or jscd > 25 Then '
frmMain.Label3.BackColor = vbRed
frmMain.Label3.ForeColor = vbWhite
frmMain.Label3.Caption = "接收信号出错!"
ElseIf Left(Text2, 1) = Chr(27) And Mid(Text2, 25, 1) = Chr(13) Then
frmMain.Label3.BackColor = vbGreen
frmMain.Label3.ForeColor = vbBlack
frmMain.Label3.Caption = "接收信号正常!"
If Left(Text2, 6) = Chr(27) & "R0032" And jscd = 25 Then
If Val(fa2) >= 0 And Len(fa2) = 4 Then
fa2 = "0" & Mid(fa2, 2, 3)
End If
frmMain.txtSend = Chr(27) & fa0 & fa1 & "9999" & zhenkong & fa2 & fa3 & fa4 & Chr(13)
lenTxtSend = Len(txtSend)
frmJishi.Label8.Caption = txtSend
frmJishi.Label11.Caption = lenTxtSend
If lenTxtSend = 24 Then
Call commFasong
Else
frmMain.Label3.BackColor = vbRed
frmMain.Label3.ForeColor = vbWhite
frmMain.Label3.Caption = "发送信号出错!"
End If
blL1 = Mid$(Text2, 19, 2)
If blL1 = "01" Then
record_jmm(0) = Val(Mid$(Text2, 21, 4)) / 10 '制品1温度
ElseIf blL1 = "02" Then
record_jmm(1) = Val(Mid$(Text2, 21, 4)) / 10 '制品2温度
ElseIf blL1 = "03" Then
record_jmm(2) = Val(Mid$(Text2, 21, 4)) / 10 '制品3温度
ElseIf blL1 = "04" Then
record_jmm(3) = Val(Mid$(Text2, 21, 4)) / 10 '制品4温度
ElseIf blL1 = "05" Then
record_jmm(4) = Val(Mid$(Text2, 21, 4)) / 10 '制品5温度
ElseIf blL1 = "06" Then
record_jmm(5) = Val(Mid$(Text2, 21, 4)) / 10 '制品6温度
End If
record_jm(0) = Val(record_jmm(0))
record_jm(1) = Val(record_jmm(1))
record_jm(2) = Val(record_jmm(2))
record_jm(3) = Val(record_jmm(3))
record_jm(4) = Val(record_jmm(4))
record_jm(5) = Val(record_jmm(5))
blL = Mid$(Text2, 7, 6)
Call Hex_bin '输出口状态鉴别
blLg = Mid$(Text2, 13, 6)
Call hex_bin1 '输出口故障状态鉴别
txtSend = ""
Else
txtSend = ""
End If
End If
If Not blnAutoSendFlag And Not blnReceiveFlag Then
frmMain.ctrMSComm.PortOpen = False
End If
End If
End Select
End Sub
以上是一段MSCOMM的ONCOMM事件代码,接收的数据按上下位机约定取出赋值于全局变量,在其它窗体进行数据记录(写入数据库).至于数据分析确如一楼说的可以海阔天空,通过数据控件及SQL语句来完成任务.
以下提供MSDN参考:
OnComm 常数
常数 值 描述
comEvSend 1 发送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 线变化。
comEvDSR 4 data-set ready 线变化。
comEvCD 5 carrier detect 线变化。
comEvRing 6 振铃检测。
comEvEOF 7 文件结束。
MSComm 控件提供下列两种处理通讯的方式:
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
SThreshold 属性
在 MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。
说明
若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。
如果在传输缓冲区中的字符数小于 value,CommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。
CommEvent 属性包含实际错误或产生 OnComm 事件的数码。注意,设置 Rthreshold 或 Sthreshold 属性为 0,分别使捕获 comEvReceive 和 comEvSend 事件无效。
4. 如何处理串口超时问题
串口通讯超时(读或写)貌似C#只能设定值(知道)没有听说会返回标志或断般下位机从站能会超时时有断上位机般主站状态所设定通讯超时时配合下位机使用并能用来直接返回超时标志水平有限知道多
5. 串口通信误码率高,什么原因,如何解决
原因很多,最常见的是:干扰、接地不好或不对、以及双方定时不一致(例如专晶振不准)等等。
你可以从属以下几方面试一试:
1、减小波特率
2、用屏蔽线传输信号(屏蔽层不要当地线用,要单点接地)
3、改用485/422
4、检查地线连接,不要形成大的环路,强弱电分开等等
6. 关于c#的串口接收问题,怎么接收多次数组进行统一处理
你问的应该是滑动平均滤波算法的C#实现,C#中可以用版队列权来实现
Queue<int> queue = new Queue<int>();
if (queue.Count > 10)
{
queue.Dequeue();
queue.Enqueue(data);
}
7. 怎样将串口接收到的数据存到数据库中
这是两个来步骤的内容。首先源是通讯,将串口接收的数据(十六进制数或ASCII码),按照通讯规约进行解析,解析输出所需的数据;然后是数据存储,这个过程就是一个数据入库过程,与是否串口接收没有大的关系,编写连接数据库代码,写入数据库即可;最后,由于串口接收数据是实时通讯,而数据的解析和写库需要时间,程序的时序应安排好,防止数据解析和写库时间过长造成数据丢失。
8. 如何实现串口数据采集,处理,逻辑控制
一楼已经给复出了正确制的思路.再提点建议:
你的下位机不仅仅是一个控制仪表,还应包含能组织和分解指令的PLC或单片机,应该符合RS485标准.LZ可以参考"人民邮电出版社"出版的"VISUAL BASIC 串口通信工程开发实例导航"一书.
9. 232串口通信怎么处理连续数据
你好!
232串口数据接收,都是按照帧来接收的,帧的大小,还要看缓冲区的设置;
你要处理接收到的数据,也就是对每一帧的接收和处理
10. 串口通讯中如何处理接收到重复的数据
dim varResult,T_varResult as string
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent '判断通信事件
Case comEvReceive: '收到Rthreshold个字节产生的接收事件
varResult = ""
varResult = MSComm1.Input
if varResult<>T_varResult then
txtResponse.Text=varResult
T_varResult =varResult
end if
MSComm1.InBufferCount = 0
End Select
End Sub