求助,我的程序只能从串口读取rssi值程序一次数据怎么回事

串口读取数据为什么连读两次_百度知道
串口读取数据为什么连读两次
我有更好的答案
于纠错,防止因为干扰造成的数据错误。如有帮助请采纳,手机则点击右上角的满意,谢谢!
采纳率:84%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。串口通讯中,为何读出数据读出时候,老是读取其中的一部分,不能一次完全读出,而是残留到下次才能读出。
作者:用户
浏览:890 次
发出的数据格式是以ASCII为2的STX为开头,以2个空格结束的字符串。格式如下STX“ABCDEFGH”字符串空格空格但是接受数据的时候,总是收不到后面的空格。年月日时分秒毫秒16进制数字的显示AS
问题描述发出的数据格式是以ASCII为2的STX为开头,以2个空格结束的字符串。格式如下STX“ABCDEFGH”字符串空格空格但是接受数据的时候,总是收不到后面的空格。年月日时分秒毫秒16进制数字的显示ASCII格式的显示3:39:-43-44-45-46-47-48ABCDEFGH&--第一次没有收到2个空格(20H20H)3:39:-41-42-43-44-45-46-47-48ABCDEFGH&--第二次,收到第一次的2个空格(20H20H),但是这次的2个空格没有受到3:39:-41-42-43-44-45-46-47-48ABCDEFGH3:40:-41-42-43-44-45-46-47-48ABCDEFGH3:40:-41-42-43-44-45-46-47-48ABCDEFGH3:40:-43-44-45-46-47-48ABCDEFGH&--再次重新启动程序,第一次没有收到2个空格(20H20H)3:48:-41-02-43-44-45-46-47-48ACDEFGH&--第二次,收到第一次的2个空格(20H20H)我采用的是MSComm控件来实现串口通信的。我设定的RTheshold是3。我设定的STheshold是3。我对MSComm不熟悉,希望能得到高手的指点和帮助。解决方案解决方案二:你读出来的长度和设置的缓冲区大小有关的.是否一次读出,这并不重要,一般情况下如果数据包比较长的话不会将缓冲区的大小(一次读出的大小),作为你是否读取完的标志.即使你的单元是固定的也不可能,因为COM的通讯某些程度上完全是不可预料的,不可能预先知道它这次会送几个给你.而是通过读取自定义协议的标志位来确认数据是否读完的.正如你所设计的'两个空格'处理时,你不能要求COM那边按照你规定的单元来送出数据的,COM其实是一个很低级的接口,他只知道做最简单的出和入动作,.而是必须将这些数据尽可能的取出来,缓存起来,由你自己的程序来重新按照'结束标志'组织,分段.解决方案三:学习一下解决方案四:我用AccessPort131测试的结果是,AccessPort完全可以做到正确的一口气读出。但是我自己的软件就做不到。希望高手能指点一下。解决方案五:引用3楼zhangpuwei的回复:我用AccessPort131测试的结果是,AccessPort完全可以做到正确的一口气读出。但是我自己的软件就做不到。希望高手能指点一下。未必,它也可能是组合几次的结果!解决方案六:有道理,一般来说,做这样的软件(串口通讯,Sokcet通讯)都要考虑头尾,粘包、半包等情况。不可能对方每一次都会正确的把数据一次性发送出来的。解决方案七:你的缓冲区设的过小。缓冲区设置多少合理,是要根据你的实际数据量来算的,不管你设置多少,你的代码中都要连续去读通讯端口发过来的数据,找到报文头和报文尾,拼合报文,这样才是合理的。解决方案八:不明白你RTheshold为什么会是3,RTheshold设置为3,则当接收缓冲内字节个数达到或超过该值后就会使MSComm控件产生OnComm事件,这样没接收到3个字节,才能触发一次OnComm事件。如果你知道应答信息的长度是固定的,那可以一次性读入,你在发送指令前,修改RTheshold的值,为应答信息的长度。如果不能确定应答信息的长度,需要解码应答信息才知道应答信息长度的,你可以设置RTheshold为1(单个单个接收,并记录到数组中,等取到记录长度的信息后,根据后续长度,重设置RTheshold)或是根据你定义的协议分段进行处理。解决方案九:“第二次,收到第一次的空格”,应该不是缓冲区设的太小,你查下你设置的InputLen是否正确。InputLen=0的时候是读取接收缓冲区中的全部信息解决方案十:引用8楼yanlongwuhui的回复:“第二次,收到第一次的空格”,应该不是缓冲区设的太小,你查下你设置的InputLen是否正确。InputLen=0的时候是读取接收缓冲区中的全部信息解决方案十一:LZ:贴出你的代码。解决方案十二:按你的叙述,应设置RTheshold=10解决方案十三:用.net2.0的SerialPortclassusingSystem.IO.SerialPortmyPort=newSerialPort();myPort.PortName="com1";//端口名myPort.BaudRate=115200;//速率myPort.DataBits=8;//数据位 myPort.StopBits=StopBits.O//停止位myPort.Parity=Parity.N//奇偶校验myPort.RtsEnable=// 打开RTS,这步很重要在指定的时间内接收串口数据并写入二进制文件。publicvoidgetRawData(SerialPortport,stringfileName,intseconds){FileStreamf1;try{port.open();//打开端口}catch(Exceptionerr){    Console.WriteLine(err.ToString()); //端口打开失败,返回  }try{f1=newFileStream(fileName,FileMode.Append);}catch(Exceptionerr){Console.WriteLine(err.ToString()); //文件打开失败,返回}  Console.WriteLine("Datawillbeloggedfrom"+port.PortName+"for"+seconds+"seconds...");BinaryWriterb1=newBinaryWriter(f1);DateTimenow=DateTime.N //获取当前系统时间while(((TimeSpan)(DateTime.Now-now)).TotalSeconds&seconds) 检测当前时间是否到了指定结束时间长度{b1.Write((byte)port.ReadByte());//写串口数据到文件}b1.Close();f1.Close();  port.Close();}发送数据到端口publicvoidsendData(SerialPortport){try{port.Open();}catch{return};byte[]s=newbyte[]{250,255,16,0,241}; port.Write(s,0,5); //参数1:字节数组;参数2:数组起始位;参数3:发送数据长度            //在这个例子里是从250开始,到241结束port.Close();}通常从serialport获得的包都有规则,或者说叫协议。比如255是一个包的开始,250是一个包的结束。获取一个完整的包你要自己来定义这部分代码。解决方案十四:PublicClassForm1InheritsSystem.Windows.Forms.FormDimstrDataAsString#Region"WindowsFormDesignergeneratedcode"PublicSubNew()MyBase.New()'ThiscallisrequiredbytheWindowsFormDesigner.InitializeComponent()'AddanyinitializationaftertheInitializeComponent()callEndSub'Formoverridesdisposetocleanupthecomponentlist.ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)IfdisposingThenIfNot(componentsIsNothing)Thencomponents.Dispose()EndIfEndIfMyBase.Dispose(disposing)EndSub'RequiredbytheWindowsFormDesignerPrivatecomponentsAsSystem.ComponentModel.IContainer'NOTE:ThefollowingprocedureisrequiredbytheWindowsFormDesigner'ItcanbemodifiedusingtheWindowsFormDesigner.'Donotmodifyitusingthecodeeditor.FriendWithEventsAxMSComm1AsAxMSCommLib.AxMSCommFriendWithEventsTextBox1AsSystem.Windows.Forms.TextBoxFriendWithEventsButton1AsSystem.Windows.Forms.ButtonFriendWithEventsLabel1AsSystem.Windows.Forms.LabelFriendWithEventsButton2AsSystem.Windows.Forms.Button&System.Diagnostics.DebuggerStepThrough()&PrivateSubInitializeComponent()DimresourcesAsSystem.Resources.ResourceManager=NewSystem.Resources.ResourceManager(GetType(Form1))Me.AxMSComm1=NewAxMSCommLib.AxMSCommMe.TextBox1=NewSystem.Windows.Forms.TextBoxMe.Button1=NewSystem.Windows.Forms.ButtonMe.Label1=NewSystem.Windows.Forms.LabelMe.Button2=NewSystem.Windows.Forms.ButtonCType(Me.AxMSComm1,System.ComponentModel.ISupportInitialize).BeginInit()Me.SuspendLayout()''AxMSComm1'Me.AxMSComm1.Enabled=TrueMe.AxMSComm1.Location=NewSystem.Drawing.Point(376,128)Me.AxMSComm1.Name="AxMSComm1"Me.AxMSComm1.OcxState=CType(resources.GetObject("AxMSComm1.OcxState"),System.Windows.Forms.AxHost.State)Me.AxMSComm1.Size=NewSystem.Drawing.Size(38,38)Me.AxMSComm1.TabIndex=1''TextBox1'Me.TextBox1.Location=NewSystem.Drawing.Point(8,32)Me.TextBox1.Multiline=TrueMe.TextBox1.Name="TextBox1"Me.TextBox1.ScrollBars=System.Windows.Forms.ScrollBars.VerticalMe.TextBox1.Size=NewSystem.Drawing.Size(248,216)Me.TextBox1.TabIndex=3Me.TextBox1.Text="TextBox1"''Button1'Me.Button1.Location=NewSystem.Drawing.Point(304,48)Me.Button1.Name="Button1"Me.Button1.Size=NewSystem.Drawing.Size(112,32)Me.Button1.TabIndex=4Me.Button1.Text="Button1"''Label1'Me.Label1.Location=NewSystem.Drawing.Point(264,16)Me.Label1.Name="Label1"Me.Label1.Size=NewSystem.Drawing.Size(120,24)Me.Label1.TabIndex=5Me.Label1.Text="Label1"''Button2'Me.Button2.Location=NewSystem.Drawing.Point(304,88)Me.Button2.Name="Button2"Me.Button2.Size=NewSystem.Drawing.Size(112,32)Me.Button2.TabIndex=6Me.Button2.Text="Button2"''Form1'Me.AutoScaleBaseSize=NewSystem.Drawing.Size(6,14)Me.ClientSize=NewSystem.Drawing.Size(472,266)Me.Controls.Add(Me.Button2)Me.Controls.Add(Me.Label1)Me.Controls.Add(Me.Button1)Me.Controls.Add(Me.TextBox1)Me.Controls.Add(Me.AxMSComm1)Me.Name="Form1"Me.Text="Form1"CType(Me.AxMSComm1,System.ComponentModel.ISupportInitialize).EndInit()Me.ResumeLayout(False)EndSub#EndRegionPrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadAxMSComm1.Settings="9600,N,8,1"AxMSComm1.RThreshold=1AxMSComm1.InputMode=MSCommLib.InputModeConstants.comInputModeBinaryAxMSComm1.PortOpen=TrueEndSubPrivateSubAxMSComm1_OnComm(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesAxMSComm1.OnCommDimbytInput()AsByteDimintInputLenAsIntegerSelectCaseAxMSComm1.CommEvent'CasecomEvReceiveCase2'此处添加处理接收的代码'AxMSComm1.InputMode=comInputModeBinary'二进制接收intInputLen=AxMSComm1.InBufferCountReDimbytInput(intInputLen)bytInput=AxMSComm1.InputDimiAsIntegerFori=0ToUBound(bytInput)IfLen(Hex(bytInput(i)))=1ThenstrData=strData&"0"&Hex(bytInput(i))ElsestrData=strData&Hex(bytInput(i))EndIfNextIfMid(strData,17,2)="20"AndMid(strData,19,2)="20"AndLen(strData)=20ThenTextBox1.Text=strDatastrData=""EndIfEndSelectEndSub'清除PrivateSubButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton2.ClickstrData=""TextBox1.Text=""EndSubEndClass解决方案十五:学习中~
【云栖快讯】新年大招!云栖社区为在读大学生/研究生准备了一份学(huan)习(zhuang)攻略,发布博文即有机会赢得iPad mini 4等大奖,学习换装两不误!欢迎报名参与~&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供求助,我的程序只能从串口读取一次数据怎么回事? - LabVIEW论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
求助,我的程序只能从串口读取一次数据怎么回事?
09:01:07  
[img=0,1]file:///C:\Users\Administrator.LVSE-NI\AppData\Roaming\Tencent\Users\\QQ\WinTemp\RichOle\7)[]}%`UTV1CRK0C{D1[SOR.png[/img]小弟做毕业设计,程序如图,我的温度检测程序每次打开的时候可以接到一次数据显示出来,然后无论串口收到什么数据显示都没有任何变化,问题出在哪里呢,求大神解答
附件: 您需要
才可以下载或查看,没有帐号?
08:53:12  
我怀疑是你没有关闭又继续读取,缓冲区一直被占用,你在读取后面加一个清空缓冲区试试
17:49:55  
我怀疑是你没有关闭又继续读取,缓冲区一直被占用,你在读取后面加一个清空缓冲区试试
谢谢,问题已经解决了,少加了一个循环
17:44:13  
楼主,可以帮我看个程序吗?和你这个情况差不多,谢谢
20:44:51  
楼主你好,我的问题和你的类似,能说一下你怎么解决的嘛
00:00:31  
谢谢,问题已经解决了,少加了一个循环
请问一下,出现了相同的问题,你的循环是哪里缺少了?帮忙指点下,谢谢
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司求助,我的程序只能从串口读取一次数据怎么回事 _微博生活网
你目前正在浏览:& > &
求助,我的程序只能从串口读取一次数据怎么回事
求助,我的程序只能从串口读取一次数据怎么回事
每次只能read四个字节,连续循环多次直到数据read完后,就阻塞了
求助,我的程序只能从串口读取一次数据怎么回事 ……
每次只能read四个字节,连续循环多次直到数据read完后,就阻塞了我需要用c#通过串口读取温湿度计的信息,我怎么通过程序不断获取温度和湿度的数据呢 还请高手赐教 ……
1.通过定时器去不断读取:定时器怎么用 具体你可以百度,我只能给你思路。 2.通过串口读取,是不管下...求助:我在用CIMCO EDIT往机床里传程序时,为什么接一次串口线只能传一个程序呢? ……
&可是接一次线只能传一个程序& : 我是想说:用usb连接线把机床(仅仅一台)和笔记本连通以后,只能...为什么我向串口发送一次数据后一直接收数据 ……
使用阻塞模式读取串口!!!求一个C语言编程的简单串口接收数据程序,能让我参考一下 ……
下载文件:串口通讯和调试_12.rar|你好!! 给你一个完整的串口通讯例程...紧急求助,现在MATLAB从串口中接收到的数据类型如图所示,怎样写程序从中提取到我想要的数据? ……
把数据附上,以文本的格式附上,我给你弄好vb6 串口通讯 我读取的数据只在开始时读取,读取一次后就不再读取了,怎么办??求代码 ……
或许后面的数据没有触发接收事件能帮我解释下PC机通过rs485串口接收智能电表的数据,具体过程是怎样实现的,谢谢 ……
分两个过程 第一是物理线路连接好以后,安装底层通讯协议,实现通讯,也就是大家说的安装驱动程序,没安装...VB程序读取串口数据流
近来项目要求VB程序通过串口读取数据流!
Dim totalnum As
Long&&&&&&&&&&&&&&&
'totalnum统计收到的帧的个数
Dim ab(1 To 20) As
Byte&&&&&&&&&&&&
'字节数据类型数组,用来存储接收到的一组字节数据
Variant&&&&&&&&&&&&&&&&&&
'用来从接收缓冲区读取数据
Private Sub
CmdClear_Click()&&&&&&&
&&& TxtShow.Text
Private Sub Cmdclose_Click()
MSComm1.InBufferCount =
0&&&&&&&&&&&&
'清除接收缓冲区
MSComm1.OutBufferCount = 0
CmdOpen.Enabled = True
Cmdclose.Enabled = False
Cmdend.Enabled = True
&&& TxtShow.Text
= TxtShow.Text & "本次共接收" & totalnum
& "帧数据" & vbCrLf
Private Sub CmdEnd_Click()
Private Sub CmdOpen_Click()
TimerOpen.Enabled = True
Cmdclose.Enabled = True
Cmdend.Enabled = False
CmdOpen.Enabled = False
Private Sub CmdSetOk_Click()
.CommPort = Val(Right(ComCom.Text, 1))
.Settings =
"9600,N,8,1"&&&&&&&&&
'设置通信口参数
.InBufferSize =
1024&&&&&&&&&&&&&
'设置MSComm1接收缓冲区为1024字节
.OutBufferSize =
1024&&&&&&&&&&&&
'设置MSComm1发送缓冲区为1024字节
.InputMode = comInputModeBinary&&
'设置接收数据模式为二进制形式
&&& ' .InputMode
= comInputModeText
.InputLen =
1&&&&&&&&&&&&&&&&&&&&
'设置Input 一次从接收缓冲读取字节数为1
.SThreshold =
0&&&&&&&&&&&&&&&&&&
'设置Output 一次从发送缓冲读取字节数为0
.InBufferCount =
0&&&&&&&&&&&&&&&
'清除接收缓冲区
.OutBufferCount =
0&&&&&&&&&&&&&&
'清除发送缓冲区
.RThreshold =
1&&&&&&&&&&&&&&&&&&
'设置接收一个字节产生OnComm事件
Val(TxtTime.Text) && 0 Then
If MsgBox("扫描间隔是" & Val(TxtTime.Text)
& "秒么?", vbYesNo, "时间确认") = vbYes Then
&&&&&&&&&&&
TimerOpen.Interval = Val(TxtTime.Text) * 1000
&&&&&&&&&&&
CmdOpen.Enabled = True
&&&&&&&&&&&
MsgBox "扫描取消", vbOKOnly, "扫描结束"
&&&&&&&&&&&
CmdOpen.Enabled = False
&&&&&&&&&&&
MsgBox "扫描时间没有设置,无法开始", vbOKOnly, "扫描结束"
CmdOpen.Enabled = False
&&& End If
Private Sub Command1_Click()
Private Sub Form_Load()
&&& totalnum =
Private Sub MSComm1_OnComm()
&&& Select Case
MSComm1.CommEvent
comEvReceive&&&&&&&&&&&&&&&&&&&&
'收到Rthreshold个字节产生的接收事件
&&&&&&&&&&&
MSComm1.Input&&&&&&&&&&&&&&&
'读取一个接收字节
&&&&&&&&&&&
av(0)&&&&&&&&&&&&&&&&&&&&
'转换保存到字节数据类型数组
&&&&&&&&&&&
MSComm1.RThreshold =
0&&&&&&&&&&&
'关闭OnComm事件接收
&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&
Loop Until MSComm1.InBufferCount &=
19&&&&&&&&&
'循环等待MSComm1接收缓冲区&=19个字节
&&&&&&&&&&&
totalnum = totalnum +
1&&&&&&&&&&
'计数器累加计数
&&&&&&&&&&&
MSComm1.InputLen =
19&&&&&&&&&&&&
'设置Input 一次从接收缓冲读取字节数为19
&&&&&&&&&&&
av = MSComm1.Input
&&&&&&&&&&
For i = 2 To
20&&&&&&&&&&&&&&&&&&&
'读取剩余19个字节
&&&&&&&&&&&&&&&
ab(i) = av(i - 2)
&&&&&&&&&&&&
TxtShow.Text = TxtShow.Text & ab(i)
&&&&&&&&&&&
TxtShow.Text = TxtShow.Text & vbCrLf
&&&&&&&&&&&
MSComm1.RThreshold = 1
End Select
Private Sub TimerClose_Timer()
MSComm1.InBufferCount =
0&&&&&&&&&&&&
'清除接收缓冲区
MSComm1.OutBufferCount = 0
If comFrm.MSComm1.PortOpen = True Then comFrm.MSComm1.PortOpen =
comFrm.TimerClose.Enabled = False
Private Sub TimerOpen_Timer()
MSComm1.PortOpen = False
Then&&&&&&&&&&&&&&&
'判断通信口是否打开
MSComm1.PortOpen =
True&&&&&&&&&&&&&&&&&&&&
'打开通信口
Then&&&&&&&
&&&&&&&&&&&
MsgBox "串口通信无效,请重新检查设置"
&&&&&&&&&&&
TimerOpen.Enabled = False
&&&&&&&&&&&
TimerClose.Enabled = False
&&&&&&&&&&&
CmdOpen.Enabled = False
&&&&&&&&&&&
Cmdclose.Enabled = False
&&&&&&&&&&&
&&& End If
TimerClose.Enabled = True
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 matlab读取串口数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信