MFC中串口控件接收到的数据混乱无法正常解析

路和前方 2014-07-18 12:30:53
我用MFC写了一个与下位机PLC通信的程序,可以通过发送读指令采集PLC上的运行参数,PLC会返回一串数据,从中可以解析出需要的信息,这样单一的过程没有问题;就是还有一个要求是有时会向PLC写设定参数的指令,设定完PLC也会返回一串数据,读和写指令不同,返回的数据也不一样,我在设定完之后再采集就发现解析的数据不正常了,问题可能出现在接收返冲区的数据出现混乱了,这个怎么解决,我的串口参数配置如下:
m_mscomm.put_CommPort(10);      //选择串口号
m_mscomm.put_InBufferSize(1024); //设置接收缓冲区字节数
m_mscomm.put_OutBufferSize(1024); //设置发送缓冲区字节数
m_mscomm.put_InputLen(0); //设置当前接收区数据长度为0
m_mscomm.put_InputMode(1); //以二进制方式读写数据
m_mscomm.put_RThreshold(100); //接收缓冲区有100个及100个以上字符时将引发一个接收数据的OnComm事件,之前设置为1时会发生误触发
m_mscomm.put_SThreshold(0); //每发送一个字符时,不触发OnComm事件
m_mscomm.put_Settings("4800,n,8,1"); //设置串口参数,"4800,n,8,1"

之前我试过在发送读指令前加上
m_mscomm.put_InputLen(0);
m_mscomm.put_InputLen(0);
还是解决不了,求大神相助!
...全文
535 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazy918 2014-08-01
  • 打赏
  • 举报
回复
好帖子。。。。。。。。。。。。。。。。。。。。。。。。。
brk1985 2014-07-23
  • 打赏
  • 举报
回复
引用 21 楼 baichi4141 的回复:
[quote=引用 20 楼 Mirale 的回复:] 我有两个问题,一是不使用串口控件的缓冲区,那怎样接收呢。因为解析是在一个单独的线程中,每当串口事件时就会创建一个线程,解析成功应该要等线程成功返回。而设置参数又是另外一个线程在等待用户设定,一断有设定它就会通过串口发送给下位机,不会管串口是否还有应答未完成,两个之间怎样协调?第二你说的发送的所有命令都保存在一个存储结构内,我理解为所有的命令统一从这个接口出来,但读和写的命令不一样如长度和功能码,如果出现采集线程和设置线程同时取命令怎么办? 虽然目前程序可以用,但是还是希望能找出可以优化的地方,还请高手指教,多谢!
没必要开那么多线程,都删掉。 你那种预估“这次应该返回8个字节”“这次应该返回107个字节”的做法,只适用于初学者的简单需求。不说别的,我就问你,如果你负责做下位机的通信模块,你怎么知道上位机下一条命令应该有多长? 最根本的做法是,设置串口控件缓冲区为1个字节,每收到一个字节都进行处理,把收到的所有字节保存在一块内存内。 每次收到并保存后检查已收到的所有数据是否满足特定格式,按照通信协议检查所有格式,例如你的需求就可以分别检验“如果当前字节数大于等于8,则判断功能码是否为XXX,如果是则OXOX”和“如果当前字节数大于等于107,则判断功能码是否为YYY,如果是则OXOX”。如果满足了其中一种格式,则按照协议处理后将该格式对应数据段删除。 上面这些都不用开新线程,如果你的串口控件使用回调函数,那就是串口控件提供线程,如果是消息响应函数,那就是主线程。这种只在特定时刻执行且不占多少运行时间的功能,压根用不着开线程,开了反而碍事。 设置参数开线程干嘛?给用户一个接口函数,用户想要设置参数时直接按用户要求生成设置参数命令后扔进发送存储区等待发送。 采集线程(也可以用定时器,反正不需要高效率)改成发送线程,负责每次发送后等待一定时间或者应答完成后发送新的命令。如果发送存储区有数据就发送设置参数命令然后删除发送存储区的数据,如果没有就发送采集命令。[/quote] mark。。。
schlafenhamster 2014-07-23
  • 打赏
  • 举报
回复
没有那么复杂。 就是 接收缓冲区 是个 循环队列, 他只管接收。即 一个 接收 指针 (写), parser 就是 分析 这个 循环队列 。即一个 读指针 (读)
baichi4141 2014-07-22
  • 打赏
  • 举报
回复
引用 14 楼 Mirale 的回复:
回答很有大局观,受教了!第一、我没有关心应答是否完成,只是关心对接收到的数据的解析,发送时间间隔不能太短,太短会出现接收到的数据解析出错,应该是应答未完成的原因,我将最短发送时间设在500MS;第二、之前中间插入设置命令的问题已经解决了,是接收缓冲区长度要分别设置,12楼有解释。 现在自动采集时插入设置命令有时还是会出现错误,可能是应答被打断,而且发送设置命令时还要修改接收缓冲区阀值,应该如何解决呢?求指导!
初学者用定时器进行串口通信也可以,等需求变复杂了再去思考更好的使用方式 你现在面临的问题,就是需求比原来复杂了,导致你原来的简单做法行不通了 所有收到的数据自己存储解析,不使用串口控件的缓冲区,每次收到数据后立刻解析已收到的所有数据,解析成功则代表此次应答完成,然后发送下一条命令 要发送的所有命令(不管是采集数据还是设置数据)都保存在一个存储结构内,每次可以发送下一条命令的时候,到这个存储结构取命令,设置数据的命令每次需要发送时加入存储结构,发送后从存储结构中删除
路和前方 2014-07-22
  • 打赏
  • 举报
回复
引用 21 楼 baichi4141 的回复:
没必要开那么多线程,都删掉。 你那种预估“这次应该返回8个字节”“这次应该返回107个字节”的做法,只适用于初学者的简单需求。不说别的,我就问你,如果你负责做下位机的通信模块,你怎么知道上位机下一条命令应该有多长? 最根本的做法是,设置串口控件缓冲区为1个字节,每收到一个字节都进行处理,把收到的所有字节保存在一块内存内。 每次收到并保存后检查已收到的所有数据是否满足特定格式,按照通信协议检查所有格式,例如你的需求就可以分别检验“如果当前字节数大于等于8,则判断功能码是否为XXX,如果是则OXOX”和“如果当前字节数大于等于107,则判断功能码是否为YYY,如果是则OXOX”。如果满足了其中一种格式,则按照协议处理后将该格式对应数据段删除。 上面这些都不用开新线程,如果你的串口控件使用回调函数,那就是串口控件提供线程,如果是消息响应函数,那就是主线程。这种只在特定时刻执行且不占多少运行时间的功能,压根用不着开线程,开了反而碍事。 设置参数开线程干嘛?给用户一个接口函数,用户想要设置参数时直接按用户要求生成设置参数命令后扔进发送存储区等待发送。 采集线程(也可以用定时器,反正不需要高效率)改成发送线程,负责每次发送后等待一定时间或者应答完成后发送新的命令。如果发送存储区有数据就发送设置参数命令然后删除发送存储区的数据,如果没有就发送采集命令。
最根本的做法从顶层来设计确实高明,如果要求严格就这么办了~。因为线程里面有很多事情要完成,开个线程感觉效率高点,设置参数是从Socket上获取的,本上位机要作为服务器接受远程用户的连接,所以要开个线程来接收socket上的数据。采集线程发送完等待一定时间的做法确实可行!Thanks!
baichi4141 2014-07-22
  • 打赏
  • 举报
回复
引用 20 楼 Mirale 的回复:
我有两个问题,一是不使用串口控件的缓冲区,那怎样接收呢。因为解析是在一个单独的线程中,每当串口事件时就会创建一个线程,解析成功应该要等线程成功返回。而设置参数又是另外一个线程在等待用户设定,一断有设定它就会通过串口发送给下位机,不会管串口是否还有应答未完成,两个之间怎样协调?第二你说的发送的所有命令都保存在一个存储结构内,我理解为所有的命令统一从这个接口出来,但读和写的命令不一样如长度和功能码,如果出现采集线程和设置线程同时取命令怎么办? 虽然目前程序可以用,但是还是希望能找出可以优化的地方,还请高手指教,多谢!
没必要开那么多线程,都删掉。 你那种预估“这次应该返回8个字节”“这次应该返回107个字节”的做法,只适用于初学者的简单需求。不说别的,我就问你,如果你负责做下位机的通信模块,你怎么知道上位机下一条命令应该有多长? 最根本的做法是,设置串口控件缓冲区为1个字节,每收到一个字节都进行处理,把收到的所有字节保存在一块内存内。 每次收到并保存后检查已收到的所有数据是否满足特定格式,按照通信协议检查所有格式,例如你的需求就可以分别检验“如果当前字节数大于等于8,则判断功能码是否为XXX,如果是则OXOX”和“如果当前字节数大于等于107,则判断功能码是否为YYY,如果是则OXOX”。如果满足了其中一种格式,则按照协议处理后将该格式对应数据段删除。 上面这些都不用开新线程,如果你的串口控件使用回调函数,那就是串口控件提供线程,如果是消息响应函数,那就是主线程。这种只在特定时刻执行且不占多少运行时间的功能,压根用不着开线程,开了反而碍事。 设置参数开线程干嘛?给用户一个接口函数,用户想要设置参数时直接按用户要求生成设置参数命令后扔进发送存储区等待发送。 采集线程(也可以用定时器,反正不需要高效率)改成发送线程,负责每次发送后等待一定时间或者应答完成后发送新的命令。如果发送存储区有数据就发送设置参数命令然后删除发送存储区的数据,如果没有就发送采集命令。
路和前方 2014-07-22
  • 打赏
  • 举报
回复
引用 19 楼 baichi4141 的回复:
所有收到的数据自己存储解析,不使用串口控件的缓冲区,每次收到数据后立刻解析已收到的所有数据,解析成功则代表此次应答完成,然后发送下一条命令 要发送的所有命令(不管是采集数据还是设置数据)都保存在一个存储结构内,每次可以发送下一条命令的时候,到这个存储结构取命令,设置数据的命令每次需要发送时加入存储结构,发送后从存储结构中删除
我有两个问题,一是不使用串口控件的缓冲区,那怎样接收呢。因为解析是在一个单独的线程中,每当串口事件时就会创建一个线程,解析成功应该要等线程成功返回。而设置参数又是另外一个线程在等待用户设定,一断有设定它就会通过串口发送给下位机,不会管串口是否还有应答未完成,两个之间怎样协调?第二你说的发送的所有命令都保存在一个存储结构内,我理解为所有的命令统一从这个接口出来,但读和写的命令不一样如长度和功能码,如果出现采集线程和设置线程同时取命令怎么办? 虽然目前程序可以用,但是还是希望能找出可以优化的地方,还请高手指教,多谢!
schlafenhamster 2014-07-21
  • 打赏
  • 举报
回复
“串口中接收数据时,接收缓冲区一次能接收多少数据啊?” 不确定 数 !
路和前方 2014-07-21
  • 打赏
  • 举报
回复
引用 16 楼 go_and_see 的回复:
如果有文档的话,最好找找文档对这个控件的说明,看看你哪里用得不对。实在不行,就不要用别人的控件了,在网上搜一下串口读写类并整合到自己的代码里。这样的话,更容易控制一些。没记错的话,有个东西叫CSerial,已经封装了基本操作。
好的,多谢你的耐心解答!
边走边瞧 2014-07-21
  • 打赏
  • 举报
回复
如果有文档的话,最好找找文档对这个控件的说明,看看你哪里用得不对。实在不行,就不要用别人的控件了,在网上搜一下串口读写类并整合到自己的代码里。这样的话,更容易控制一些。没记错的话,有个东西叫CSerial,已经封装了基本操作。
边走边瞧 2014-07-21
  • 打赏
  • 举报
回复
引用 12 楼 Mirale 的回复:
我的问题解决了,问题出在没有对不同长度的接收数据进行处理,说到底就是串口接收缓冲区长度的选择,即put_RThreshold()如何设定,因为采集参数时下位机返回的数据长度是117字节,而设置参数时下位机返回的数据长度是8字节,接收两种不同长度的数据包,对接收缓冲区要进行不同的设置,想到这点我试过直接设为8,但是上面117个字节似乎不是一步到位的,只要收到8个或多于8个字节时就会触发串口事件函数,这样会导致采集时接收数据不完整,所以要分别设置 下面是串口初始化设置参数

                m_mscomm.put_CommPort(10);      //选择串口号
		m_mscomm.put_InBufferSize(1024);     //设置接收缓冲区字节数
		m_mscomm.put_OutBufferSize(1024);    //设置发送缓冲区字节数
		m_mscomm.put_InputLen(0);            //设置当前接收区数据长度为0
		m_mscomm.put_InputMode(1);           //以二进制方式读写数据
		m_mscomm.put_RThreshold(117);          //接收缓冲区有117个及117个以上字符时将引发一个接收数据的OnComm事件,之前设置为1时会发生误触发
		m_mscomm.put_SThreshold(0);          //每发送一个字符时,不触发OnComm事件
		m_mscomm.put_Settings("4800,n,8,1");         //设置串口参数,"4800,n,8,1"
下面是串口事件处理函数

void CCentraControlSystemDlg::OnCommMscomm1()
{
	// TODO: Add your message handler code here
	 if(m_mscomm.get_CommEvent()==2)
	 {
		 ComThreadInfo *comInfo = new ComThreadInfo;
		 VARIANT variant_inp = m_mscomm.get_Input();//读缓冲区
		 comInfo->safearray_inp = variant_inp;
		 comInfo->_this = this;
		 long len = comInfo->safearray_inp.GetOneDimSize();
		 if(len == 8)  //设置参数时下位机返回的8字节数据
		 {
			 m_mscomm.put_RThreshold(117);  //调整接收缓冲区长度以恢复正常接收采集参数时返回的数据
		 } 
		 else
		 {
			 pThread=AfxBeginThread(ComThreadFunc,comInfo);   //如果触发串口事件时的数据长度为117即为采集时的返回数据,则启动解析串口接收区数据的线程
		 }
	 }
}
下面是我在发送设置参数前的操作 m_mscomm.put_RThreshold(8); //设置参数前将接收缓冲区的阀值设为8字节 m_mscomm.put_Output(COleVariant(array)); //发送设定参数 这里再问大神们一个问题,串口中接收数据时,接收缓冲区一次能接收多少数据啊?跟什么有关?这样接收的数据如果没有达到接收缓冲区设置的阀值,应该还会等待下一次接收直到达到接收缓冲区阀值触发串口事件处理函数。
接收缓冲区一次能接收多少数据,这个问题不知道该怎么回答你。因为你用的是别人的控件,这要看控件如何实现的。俺没用过这个控件,是直接读写串口的,所以没有接收缓冲区的问题。
路和前方 2014-07-21
  • 打赏
  • 举报
回复
引用 11 楼 baichi4141 的回复:
别想什么多线程了,想想串口通信的本质吧 串口本质上就是一个一个字节的发送,怎么可能把两条不同的命令连起来,连起来之后算一条命令还是两条命令?有些通信协议直接规定了“一段时间内没有接收到下一个字节,此时认为之前收到的全部字节构成一条命令”。 你发出一条完整的命令后主动权就交给了对方,只有在对方返回一条完整的应答后,你才被允许发送下一条命令。 此外,485是一对多主从通信,如果是232的话允许发收同时进行,485的话压根就是同一时间只有一台设备允许发送数据,你正发第二条命令的时候从机发回第一条命令的应答,结果就是两边数据撞上谁也收不到 从楼主把一堆应答攒在一起处理的做法来看,楼主发送数据时压根就不管是否应答完成,大概是放在一个间隔较长的定时器里定时发送的吧,原本定时器的间隔较长所以每次应答完成后才会发送下一条命令,而现在楼主想要插入一条其他命令,应答就被打断了,这就是问题的原因 PLC没有多线程,串口通信和多线程没有关系,485不支持两边同时发送数据,串口的打开和关闭更加和通信对象没有任何关系
回答很有大局观,受教了!第一、我没有关心应答是否完成,只是关心对接收到的数据的解析,发送时间间隔不能太短,太短会出现接收到的数据解析出错,应该是应答未完成的原因,我将最短发送时间设在500MS;第二、之前中间插入设置命令的问题已经解决了,是接收缓冲区长度要分别设置,12楼有解释。 现在自动采集时插入设置命令有时还是会出现错误,可能是应答被打断,而且发送设置命令时还要修改接收缓冲区阀值,应该如何解决呢?求指导!
路和前方 2014-07-21
  • 打赏
  • 举报
回复
引用 10 楼 go_and_see 的回复:
不会有问题。这样的话,你要验证下位机是否有问题了。因为你发送指令用的是局部变量,不可能出错的,串口处理线程函数看上去也没什么问题。 你频繁且交替调用设置参数和取参数,看看会怎样。如果数据乱了,那就是下位机对多线程调用支持得不好。这样的话,可能你要在同一个线程中发送指令和取参数了。且发送指令和取参数要隔一些时间,不然下位机还是会出错。
出错之后用put_PortOpen()关闭、打开串口就没问题了,因为PLC用是485总线,转232后跟PC相连的,这个不太清楚下位机对多线程调用支持与否,可否考虑用两个串口控件呢,一个用来设定参数,一个用来读取参数[/quote] 下位机出错的可能性比较大,因为打开关闭串口之后会重置下位机内部状态。[/quote] 下位机没问题的,我发现问题出在接收缓冲区的阀值设置上,现在已经解决,我在12楼里面还有一个问题能否给予解答,谢谢!
路和前方 2014-07-21
  • 打赏
  • 举报
回复
我的问题解决了,问题出在没有对不同长度的接收数据进行处理,说到底就是串口接收缓冲区长度的选择,即put_RThreshold()如何设定,因为采集参数时下位机返回的数据长度是117字节,而设置参数时下位机返回的数据长度是8字节,接收两种不同长度的数据包,对接收缓冲区要进行不同的设置,想到这点我试过直接设为8,但是上面117个字节似乎不是一步到位的,只要收到8个或多于8个字节时就会触发串口事件函数,这样会导致采集时接收数据不完整,所以要分别设置 下面是串口初始化设置参数

                m_mscomm.put_CommPort(10);      //选择串口号
		m_mscomm.put_InBufferSize(1024);     //设置接收缓冲区字节数
		m_mscomm.put_OutBufferSize(1024);    //设置发送缓冲区字节数
		m_mscomm.put_InputLen(0);            //设置当前接收区数据长度为0
		m_mscomm.put_InputMode(1);           //以二进制方式读写数据
		m_mscomm.put_RThreshold(117);          //接收缓冲区有117个及117个以上字符时将引发一个接收数据的OnComm事件,之前设置为1时会发生误触发
		m_mscomm.put_SThreshold(0);          //每发送一个字符时,不触发OnComm事件
		m_mscomm.put_Settings("4800,n,8,1");         //设置串口参数,"4800,n,8,1"
下面是串口事件处理函数

void CCentraControlSystemDlg::OnCommMscomm1()
{
	// TODO: Add your message handler code here
	 if(m_mscomm.get_CommEvent()==2)
	 {
		 ComThreadInfo *comInfo = new ComThreadInfo;
		 VARIANT variant_inp = m_mscomm.get_Input();//读缓冲区
		 comInfo->safearray_inp = variant_inp;
		 comInfo->_this = this;
		 long len = comInfo->safearray_inp.GetOneDimSize();
		 if(len == 8)  //设置参数时下位机返回的8字节数据
		 {
			 m_mscomm.put_RThreshold(117);  //调整接收缓冲区长度以恢复正常接收采集参数时返回的数据
		 } 
		 else
		 {
			 pThread=AfxBeginThread(ComThreadFunc,comInfo);   //如果触发串口事件时的数据长度为117即为采集时的返回数据,则启动解析串口接收区数据的线程
		 }
	 }
}
下面是我在发送设置参数前的操作 m_mscomm.put_RThreshold(8); //设置参数前将接收缓冲区的阀值设为8字节 m_mscomm.put_Output(COleVariant(array)); //发送设定参数 这里再问大神们一个问题,串口中接收数据时,接收缓冲区一次能接收多少数据啊?跟什么有关?这样接收的数据如果没有达到接收缓冲区设置的阀值,应该还会等待下一次接收直到达到接收缓冲区阀值触发串口事件处理函数。
baichi4141 2014-07-20
  • 打赏
  • 举报
回复
别想什么多线程了,想想串口通信的本质吧 串口本质上就是一个一个字节的发送,怎么可能把两条不同的命令连起来,连起来之后算一条命令还是两条命令?有些通信协议直接规定了“一段时间内没有接收到下一个字节,此时认为之前收到的全部字节构成一条命令”。 你发出一条完整的命令后主动权就交给了对方,只有在对方返回一条完整的应答后,你才被允许发送下一条命令。 此外,485是一对多主从通信,如果是232的话允许发收同时进行,485的话压根就是同一时间只有一台设备允许发送数据,你正发第二条命令的时候从机发回第一条命令的应答,结果就是两边数据撞上谁也收不到 从楼主把一堆应答攒在一起处理的做法来看,楼主发送数据时压根就不管是否应答完成,大概是放在一个间隔较长的定时器里定时发送的吧,原本定时器的间隔较长所以每次应答完成后才会发送下一条命令,而现在楼主想要插入一条其他命令,应答就被打断了,这就是问题的原因 PLC没有多线程,串口通信和多线程没有关系,485不支持两边同时发送数据,串口的打开和关闭更加和通信对象没有任何关系
边走边瞧 2014-07-20
  • 打赏
  • 举报
回复
引用 9 楼 Mirale 的回复:
[quote=引用 8 楼 go_and_see 的回复:] 不会有问题。这样的话,你要验证下位机是否有问题了。因为你发送指令用的是局部变量,不可能出错的,串口处理线程函数看上去也没什么问题。 你频繁且交替调用设置参数和取参数,看看会怎样。如果数据乱了,那就是下位机对多线程调用支持得不好。这样的话,可能你要在同一个线程中发送指令和取参数了。且发送指令和取参数要隔一些时间,不然下位机还是会出错。
出错之后用put_PortOpen()关闭、打开串口就没问题了,因为PLC用是485总线,转232后跟PC相连的,这个不太清楚下位机对多线程调用支持与否,可否考虑用两个串口控件呢,一个用来设定参数,一个用来读取参数[/quote] 下位机出错的可能性比较大,因为打开关闭串口之后会重置下位机内部状态。
路和前方 2014-07-19
  • 打赏
  • 举报
回复
引用 8 楼 go_and_see 的回复:
不会有问题。这样的话,你要验证下位机是否有问题了。因为你发送指令用的是局部变量,不可能出错的,串口处理线程函数看上去也没什么问题。 你频繁且交替调用设置参数和取参数,看看会怎样。如果数据乱了,那就是下位机对多线程调用支持得不好。这样的话,可能你要在同一个线程中发送指令和取参数了。且发送指令和取参数要隔一些时间,不然下位机还是会出错。
出错之后用put_PortOpen()关闭、打开串口就没问题了,因为PLC用是485总线,转232后跟PC相连的,这个不太清楚下位机对多线程调用支持与否,可否考虑用两个串口控件呢,一个用来设定参数,一个用来读取参数
边走边瞧 2014-07-18
  • 打赏
  • 举报
回复
引用 6 楼 Mirale 的回复:
[quote=引用 5 楼 go_and_see 的回复:] 再问一个问题,发送指令和收取COM口数据是否用的同一个缓冲区?如果是,那么就是多线程的问题,如果不是,要排除一下是否下位机有问题。俺接触过一些下位机,不少不支持多线程操作。 你的发送指令和接收数据的缓冲区,最好弄两个,一个只发送指令,一个只接收数据,这样可以避免多线程问题。
不是的,发送时用的都是局部变量,接收时在对话框类中定义了一个变量类型的成员变量,串口事件函数中会把对话框类的this指针传过线程函数,然后在串口处理线程函数中通过_this指针获取窗体类中的那个变体成员变量,接下来再对这个变量进行解析的,这个会不会有问题呢?[/quote] 不会有问题。这样的话,你要验证下位机是否有问题了。因为你发送指令用的是局部变量,不可能出错的,串口处理线程函数看上去也没什么问题。 你频繁且交替调用设置参数和取参数,看看会怎样。如果数据乱了,那就是下位机对多线程调用支持得不好。这样的话,可能你要在同一个线程中发送指令和取参数了。且发送指令和取参数要隔一些时间,不然下位机还是会出错。
路和前方 2014-07-18
  • 打赏
  • 举报
回复
引用 4 楼 i03630211 的回复:
感觉数据接收后的解析代码有问题
我应该为读和写PLC时返回的两串不同数据设置不同的解析入口吗,那又根据什么条件判断呢,接收区数据长度?
路和前方 2014-07-18
  • 打赏
  • 举报
回复
引用 5 楼 go_and_see 的回复:
再问一个问题,发送指令和收取COM口数据是否用的同一个缓冲区?如果是,那么就是多线程的问题,如果不是,要排除一下是否下位机有问题。俺接触过一些下位机,不少不支持多线程操作。 你的发送指令和接收数据的缓冲区,最好弄两个,一个只发送指令,一个只接收数据,这样可以避免多线程问题。
不是的,发送时用的都是局部变量,接收时在对话框类中定义了一个变量类型的成员变量,串口事件函数中会把对话框类的this指针传过线程函数,然后在串口处理线程函数中通过_this指针获取窗体类中的那个变体成员变量,接下来再对这个变量进行解析的,这个会不会有问题呢?
加载更多回复(5)

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧