VB.net串口通讯asp.net 接收json数据数据写法

共有1204位成员   人气指数 -   最新排名 -
【话题】PLC串口通讯如何“实时”的采集数据?
10:28:50 来自:雪樱曼舞 浏览数:116次
我用MSCOMM控件和PLC通讯,用PLC的通讯协议,发一条命令它回一条,但必须得等PLC回复后才能发第二条命令。我用timer控件循环地发命令,处理收到的数据。但这样一个timer周期大概要2、3秒,谈不上实时地更新显示数据。以前用触摸屏配套的组态软件编程,如果是显示PLC某个地址的状态,PLC有变化马上能显示出来,一页屏上可以监视显示许多个地址,不知道他们是怎么做到的?
王婉乔回复于27日11点18分 
LZ:完全可由Timer控件实现轮询PLC,而下位机返回数据的接收由MSCOMM控件的ONCOMM事件实现.其关键取决于你的PC与PLC间的通信协议.
可可豆回复于27日12点07分 
用循环处理,当接收到回复后就发送命令
taoming11回复于27日12点57分 
LZ:从你叙述的通信协议看,PLC返回的指令有33或42字节长度,为何不做成相同字节长度?
你使用9600波特率,理论最大传送字节为每秒960字节,大约每字节需1ms,则PLC返回42字节指令的时间至少需42ms,建议你的若轮询指令间隔为100ms,这样每秒可轮询10个地址的指令.如果需要每秒接收更多地址指令,除了提高波特率外,还可修改通信协议约定,将PLC返回指令中不必要的内容取消(如表示网络的部分),也可采用数字数据使用字节数据而非ASCII字符组成)
其次请检查PLC在收到轮询指令,它反应且回复指令的时间需要多少ms.
接收代码中尽可能不使用Doevents语句.
书中找宝回复于27日13点44分 
LZ:请将你的PC与PLC间的通信协议叙述一下?
一片云回复于27日14点30分 
首先我印象中,timer是可以设置发出命令的时间的啊
家回山回复于27日15点19分 
& & 谢谢carefire,PLC是有个multiple memory area read,虽然可以一条命令读不同区域,但不能设置每个区域各读几个字,回头再跟欧姆龙确定一下。
& & 是用一根我焊的线直接连接的,串口对串口。
& & 这个方法是蛮省时间的,但timer的interval属性要设置好了。你说的设置两个变量是不是用于timer的interval的值啊?
法国小蜗牛回复于27日16点12分 
我是在timer里调用过程发命令,然后doevents等待接受事件,接受完了再处理数据并显示,然后发第二个命令。。。
对于循环我也有fzx4936的顾虑。我奇怪人家触摸屏的组态软件是怎么做的?
my100_100回复于27日17点06分 
用循环方式,发送命令,延时处理,当接收到正确的回复字符后,再循环;其中接受数据延时处理是必需的,否则接受字符有误.
xuejunyu81回复于27日18点03分 
用事件驱动,先发命令,然后有数据进来就触发,接收数据,处理完后再发送命令...
biscuit回复于27日19点01分 
LS:我就是用timer轮询,然后等待控件的接受事件。
LSS:难道是波特率的关系?我只设到9600,而以前用的触摸屏是115200。
有没有人知道组态软件内部都是怎么做的?
我爱我牛001回复于27日19点57分 
可能的原因:
1. 人家组态软件发一条命令,返回的是一批数据,要看你如何使用PLC协议,如果一个地址一个地址地读,当然慢了。
2. 电脑到PLC的硬件连接,直接连就最好了,如果用非工业无线模块、USB转(新电脑都没有配置串口)什么的,
& & 可能会产生莫名其妙的副作用。
1. 预先在命令数组填充全部命令,用一个timer每次发一个命令(发送周期取决于PLC协议),
在oncomm事件处接收数据,然后放入“命令-数据”数组。
如果在“命令-数据”数组里加入时间标记,还可以判断响应是否符合要求。
2. 用另外一个timer专门处理前面的“命令-数据”数组,如果处理快的话,就等待前面的数据,
可以设置两个变量来协调两个timer。
这样就可以做到类似异步多线程的效果,感觉流畅,而且不用doevents。
云中追梦回复于27日20点51分 
我的意思是:设置公共缓冲数组,使用事件方式接收,timer1只管发命令,timer2只管处理,设置read_index和write_index,write_index增1,oncomm接收数据写入公共数组,然后timer2使read_index增1,从公共数组读出处理,始终使read_index &=write_index。
命令timer1的interval可以:
(1)设置为最长的plc响应时间
(2)也可根据每次命令动态修改
处理timer2的interval可以固定设置为5~50毫秒。
这样的好处:串口异步接收时可以处理上一次结果和界面操作,而且可以做到不用doevents。
不过一次oncomm事件后,如果返回很长,串口缓冲不一定就有本次的全部数据,可能被分割到几次事件
幸好你的数据好像都以“@”开头而不用太麻烦。
jiangning98回复于27日21点50分 
我的建议是用循环
wangxuxin回复于27日22点52分 
楼主,将程序贴出来共同学习探讨一下吗?
sherry0326回复于27日23点53分 
波特率设高一点
fh120969回复于28日04点00分 
zhoush521回复于28日05点10分 
可能的原因:
1. 人家组态软件发一条命令,返回的是一批数据,要看你如何使用PLC协议,如果一个地址一个地址地读,当然慢了。
2. 电脑到PLC的硬件连接,直接连就最好了,如果用非工业无线模块、USB转(新电脑都没有配置串口)什么的,
& & 可能会产生莫名其妙的副作用。
1. 预先在命令数组填充全部命令,用一个timer每次发一个命令(发送周期取决于PLC协议),
在oncomm事件处接收数据,然后放入“命令-数据”数组。
如果在“命令-数据”数组里加入时间标记,还可以判断响应是否符合要求。
2. 用另外一个timer专门处理前面的“命令-数据”数组,如果处理快的话,就等待前面的数据,
可以设置两个变量来协调两个timer。
这样就可以做到类似异步多线程的效果,感觉流畅,而且不用doevents。
小树快快长回复于28日06点08分 
应该不是循环 可能是事件通知
wang111回复于28日07点08分 
timer控件循环地发命令,处理收到的数据。但这样一个timer周期大概要2、3秒
不会要这么长吧,能否将代码贴出来让我们学习一下?
大家都好回复于28日08点06分 
请大家看仔细 lz已经首先否定了用循环的方法了
用timer已经可以到毫秒了 lz还是嫌太慢
如果用循环 中间不用doevents系统会假死 用了doevents循环会更慢
VB语言的其他话题...
热门脚本语言:【教你】编写一个串口程序,作为上位机,和单片机通信 - 科创论坛
【教你】编写一个串口程序,作为上位机,和单片机通信
10 回复 / 4573 浏览
4 年前 - 12:32t57139
我们的生活离不开单片机,单片机要和上位机通信,通信最简单的方式是靠串口。本文介绍,如何编写一个程序,在电脑上向串口那一头的单片机发送信息,以及接收从串口传回的信息。这种程序(通常叫做串口调试程序),网络上其实到处都是;但是如果大家学会自己去写,就可以定制属于自己的上位机,和其他代码结合,实现丰富多彩的功能。比如,我可以写一个3D小游戏,从串口获取单片机上陀螺仪给出的姿态数据,控制游戏中物体的动态。动手之前,你需要:一个已经编程,可以通过串口接受和发送数据的单片机;一台电脑,安装了Visual Studio 和 .NET Framework 4;考虑到兼容性(win7/vista用户默认安装3.5),可以换用NET Framework 3.5电脑上的串口可以是原生串口,也可以是USB转串口。微软开发工具(包括VS2012)到这里下载:把我写好的程序发上来做个参考:
我在上面的文本框中输入一串字符,点TX按钮发送给单片机;单片机收到这些字符之后,把它们的ascii代码,用十进制数字表示出来,结合一些说明字符(如&recv&),通过串口发回到电脑。电脑收到字符之后产生一个应用程序事件,在事件处理程序中将收到的内容加到界面下方的文本框中。在这个例子里,串口一次性发送了4个字符,如果单片机接收一个字符,用printf()函数输出一次(每次十几个字符),显然,printf()函数在完成之前,由电脑发来的下一个字符已经到达,这会导致一些字符的丢失。例子中使用了STM8单片机的中断功能接管收发,并且软件上实现了FIFO缓存(先入先出缓存),所以单片机可以在正常工作不被打扰的情况下,轻松地处理来自串口的数据。
+25 &科创币 &&krfantasy &&
4 年前 - 12:45529778
良哥用是C#写的??目前我刚开始玩C#.以前用只用VB写过个串口调试助手,单片机配合上位机可以做很多有趣的东西!
4 年前 - 12:51529780
然而,一个像上面这样的串口工具是复杂的。主程序在这里下载: 11.0k28次 请记得安装.NET Framework 4.0-----------------------------------------------------------------如果只实现其基本功能,代码却很简单。下面就用VB.NET,给各位奉上实现串口功能所需要的最短代码。
4 年前 - 13:05529789
如果你会C#,就把语法换成C#语法,相信这不是什么难事。我们首先实现串口发送功能。在VS2012里面,新建一个Windows 窗体应用程序,添加一个按钮:
然后代码如下: 在窗体的load事件中,加入初始化代码;在按钮的click事件中,向单片机发送字符串asdf.启动前请保证串口的名字是程序中的COMxx(到底是COM多少,请打开设备管理器查看)。
4 年前 - 13:31529800
运行,按下按钮,于是就向串口发送了4个字节asdf:
蓝色是发送,黄色是收到的来自单片机的反馈,同步进行的。
透露一下STM8代码。使用IAR编译
4 年前 - 13:40529806
//main.c#include &libpin.c&//everything in libpin.cfifobuffer txbuf,void send_out(uchar input);void check_rx();//life of printfint putchar(int c){  send_out(c);  return (c);}#define high(whatever) pinhigh(&whatever)#define low(whatever) pinlow(&whatever)#define flip(whatever) pinflip(&whatever)void init(){  delay(60000);//stable  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  pininit(&out,'D',7,'p');    fifobufferinit(&txbuf);  fifobufferinit(&rxbuf);    UART2_Init(9600,UART2_WORDLENGTH_8D,UART2_STOPBITS_1,UART2_PARITY_NO,             UART2_SYNCMODE_CLOCK_DISABLE ,UART2_MODE_TXRX_ENABLE);    UART2_ITConfig(UART2_IT_TXE, ENABLE);    UART2_ITConfig(UART2_IT_RXNE, ENABLE);  UART2_Cmd(ENABLE);}void main(){  init();  enableInterrupts();  while(1){    flip(out);    check_rx();  }}#pragma vector = 22__interrupt void txe(){  if(fifobufferremain(&txbuf)!=0){    UART2_SendData8(fifobufferout(&txbuf));  }else{    UART2_ITConfig(UART2_IT_TXE, DISABLE);   }}#pragma vector = 23__interrupt void rxne(){  fifobufferin(&rxbuf,UART2_ReceiveData8());}void check_rx(){  if(fifobufferremain(&rxbuf)!=0){    uchar a=fifobufferout(&rxbuf);    printf(&recv ascii %d\\x0d\\x0a&,a);  }}inline void send_out(uchar input){  fifobufferin(&txbuf,input);  UART2_ITConfig(UART2_IT_TXE, ENABLE); }
4 年前 - 14:17529812
然后我们要给这个程序添加功能,实现接收串口数据。首先,创建一个timer(定时器)控件,设置interval属性为1000让它每秒触发一次;
界面中添加一个文本框,叫textbox1:  然后在这个timer1的触发事件里,添加接收串口数据的代码。代码的意思是,当接收缓冲区的字符数量大于0时,不断地从缓冲区读出字节,并转换为字符,添加到文本框textbox1里面。
重点是在窗体load事件中加入timer1.enabled=true,让定时器开始计时。运行效果如下:程序每隔一秒,刷新一次,将接收缓冲区中的字符加到文本框textbox1里面。只要按下按钮发送asdf,就能收到单片机回传的数据了。如果希望提高刷新速度,请更改timer1的interval属性。这里是发送和接受示范的源代码(当然,包含工程文件): 74.0k16次
4 年前 - 17:22529848
来学习下,顶楼主
--1 &科创币 &&20!不曾存在 &&
4 年前 - 19:05529875
请教楼主:如果用单片机自带的UART硬件来串口通讯,也需要串口中断吗?UART应该是有一定的缓存空间吧,只要在溢出前由程序取出就行?
4 年前 - 22:27529953
引用第8楼laji3865689于 19:05发表的  :请教楼主:如果用单片机自带的UART硬件来串口通讯,也需要串口中断吗?UART应该是有一定的缓存空间吧,只要在溢出前由程序取出就行? STM8S自带的UART2是没有缓冲区的,比如连续发送多个字节,通常除了第一个之外,其他全部没发送。必须等待上一个发完,才能发出下一个。读取也是一样的,如果收到数据不及时读出,下一个到达的数据会冲走上一个。缓存只能是软件实现。目前收发都是64byte FIFO buffer
4 年前 - 23:04529965
求直接I/O写法
想参与大家的讨论?现在就
novakon&&&
学术分 16科创币 40938总主题 1267 帖总回复 9996 楼拥有证书:会员 笔友 学者 注册于
15:34最后登陆
已走,勿送
Intelligence given, machines smarter.
nkc Development Server
科创研究院 (c)
蜀ICP备号-2 川公网安备58号串口接收数据问题【vb.net吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:5,560贴子:
串口接收数据问题收藏
Private Sub MSComm1_OnComm(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MSComm1.OnComm&&&&&&&& Select mEvent&&&&&&&&&&&& Case 2 'comEvReceive&&&&&&&&&&&&&&&& On Error Resume Next&&&&&&&& End Select&&&& End Sub我找不到这个接收事件,请高手指点一下!
登录百度帐号推荐应用本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 asp.net文件路径写法 的文章

更多推荐

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

点击添加站长微信