MSCOMM串口通信缓存 接收区缓存如何清除 请教各

VS2010 基于mscomm控件的串口通信 不能接受【vs2010吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3,178贴子:
VS2010 基于mscomm控件的串口通信 不能接受收藏
求大神赐教:本人小白一名,第一次接触VS2010,照着别人的代码稍微改动了下,实现最基本的串口通信(按钮3个:打开串口,关闭串口,发送;编辑框2个:发送框,接收框),发现可以发送,但是不能显示在接收框中。以下是全部添加的代码:void CcommtestDlg::OnBnClickedButtonOpen(){// TODO: 在此添加控件通知处理程序代码m_mscomm.put_CommPort(3); //set com3m_mscomm.put_Settings("9600,n,8,1");//设置串口波特率9600,无校验,8位数据,1个停止位,m_mscomm.put_InBufferSize(1024); //设置输入缓冲区大小m_mscomm.put_OutBufferSize(1024);//设置输出缓冲区大小m_mscomm.put_InputMode(1);//选择发送形式为二进制m_mscomm.put_RThreshold(1);//当串口输入缓冲区有一个或者一个以上字符时激发ONCOMM事件转入ONCOMm事件处理程序if(m_mscomm.get_PortOpen()) //检查串口状态,如果是打开的就把它关掉{m_mscomm.put_PortOpen(FALSE);} if(!m_mscomm.get_PortOpen()){m_mscomm.put_PortOpen(TRUE);m_mscomm.put_InputLen(0); //读取缓冲区全部内容m_mscomm.get_Input();//预读,清空缓冲区AfxMessageBox(_T("the com3 is ready"));}else{m_mscomm.put_OutBufferCount(0);AfxMessageBox(_T("the com3 is error"));}}void CcommtestDlg::OnBnClickedButtonClose(){// TODO: 在此添加控件通知处理程序代码m_mscomm.put_PortOpen(FALSE);//关闭串口AfxMessageBox(_T("the com3 is close"));}void CcommtestDlg::OnBnClickedButtonSend(){// TODO: 在此添加控件通知处理程序代码UpdateData(true);char TxData[100];int Count = m_EditSend.GetLength();for(int i = 0; i & C i++)TxData[i] = m_EditSend.GetAt(i);CByteAarray.RemoveAll();array.SetSize(Count+2);for(int i = 0; i & C i++)array.SetAt(i, TxData[i]);array.SetAt(Count, '\r');
//在发送的字符后加入\r\narray.SetAt(Count+1, '\n');m_mscomm.put_Output(COleVariant(array));m_EditSend.Empty();//清空编辑框UpdateData(false);//更新编辑框内容}BEGIN_EVENTSINK_MAP(CcommtestDlg, CDialogEx)ON_EVENT(CcommtestDlg, IDC_MSCOMM1, 1, CcommtestDlg::OnCommMscomm1, VTS_NONE)END_EVENTSINK_MAP()void CcommtestDlg::OnCommMscomm1(){// TODO: 在此处添加消息处理程序代码static unsigned int cnt=0;VARIANT variant_//计算机底层传回的是VARIANT数据类型COleSafeArray safearray_//由VARIANT派生的一种数据类型继承了VARIANT的特性long len,k;BYTE rxdata[1024]; //定义BYTE数组大小作用类似于单片机的数据缓存区SBUFCS //定义CString变量if(m_mscomm.get_CommEvent ()==2 )//值为2时骸表括示接收缓冲区存在有效字符{cnt++;variant_inp=m_mscomm.get_Input();//读取缓冲区消息, 取得缓冲区所有内容赋给VARRINT型í变量variant_inpsafearray_inp=variant_//变量转换len=safearray_inp.GetOneDimSize();//得到有效的数据长度for(k=0;k&k++){safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组}for(k=0;k&k++) //将数组转化为CString型变量{BYTE bt=*(char*)(rxdata+k);
strtemp.Format("%02X",bt);
//将字符送入临时变量strtemp存放
m_EditReseive+=
//加入对应字符串data中
CString temp="\r\n"; //换行m_EditReseive+=}}UpdateData(FALSE);}
我也是只能发不能收.............
这个行,第14楼,加上就收到了,,,,应该是收到了,但是没有触发,加上映射就可以了
这个映射自动就有,但是还是不能接收啊
老兄能分享下mscomn控件吗
登录百度帐号wincc 使用mscomm控件向串口发送和接收16进制数据 -- 西门子学习 -- 工控网博客
欢迎西门子学习光临
$由于有部分内容来源于网络,如果涉及到您的版权,我会及时删除处理。欢迎来我的BLOG指导和交流!
可以通过如下方式与我取得联系:购买PLC和方案咨询电话:
活到老,学到老!
标签(TAG): 查了一下前面各位大侠所提的有关此方面的问题,加上这两天的试验,总结一下,提出问题,希望各位大侠指点。
前面已有“醉夜清风”、“hihihi”、“博雅”等朋友提出过,参见以下所例帖子:
1、使用C脚本:
参见“醉夜清风”在“希望高手参与讨论--在WINCC中实现利用mscomm控件与串口通讯”中所提到的方法,使用四种函数对MSCOMM控件的属性值
进行读写。在网上查了一下,好像是参照一篇论文《Mscomm与C在监控系统和智能仪表的串行通讯中的应用》的。下载了这篇论文看了看,写得很简约,实在
有些怀疑作者是否真的是用这种方法实现的。
& & & 用这种方法试了一下,对串口进行打开、关闭的控制没问题,试图编写读写数据的控制时,感觉太麻烦了,于是暂时放弃。
2、使用VBS:
& & & 这个花了一天多的时间。
& & & 现在做到了以下功能:串口的打开、关闭控制;数据的接收;ASCII码的发送(非ANSI码,仅包括其前127个字符)。
& & & 现在主要待解决的问题是这样的:
对于ANSI码的后120多个字符的发送,在VC、VB中的代码均可以实现,其中VC中可以以CBYTEARRRY数组实现、VB中是以BYTE数组实
现。但在VBS中如何实现,现在还没有找到办法,查阅了VBS的说明,并且试验了,使用CHR()函数肯定不行,因为其只能将ASCII字符转换成
ASCII字码,不能正确转换字码>&H7E的ANSI字符,查看了网上的介绍说,要使用二进制方式进行传输,也就是说要使用VARIANT型变量的
BYTE子类型进行,但我试着将一个BYTE类型数据赋值给COMM.OUTPUT后,并没有反应。而字符型或字符串型均可,包括UNICODE字符都可
以正常传输。
& & & 再后来我将两个串口对接,用串口调试助手向WINCC中发送各种数据,在ONCOMM事件中将收到的数据从COMM.INPUT赋值给COMM.OUTPUT,直接发出去,也都可正常显示。从COM口接收的数据也是VARIANT型数据,直接输出到WINCC中的一个无符号8位数据的变量,也可正常显示,也就是说接收的问题已解决,完全可以进行下一步的解析处理了。
& & && 在VBS中调用API函数肯定不行,在网上也有这方面的介绍。
& & && 前面有个帖子里,“博雅”兄说不能在VBS中调用MSCOMM,但我感觉并不是不能用,现在我已经做到这一步了,可以说关键问题只剩下最后一步了(变量赋值的问题了),要放弃实在是有点可惜啊!
& & && 如果设备的通讯代码只用ASCII方式,那么在VBS中调用MSCOMM控件到是可行的了。
& & && 前面几位仁兄大概也曾为此问题困扰过,不只现在问题是否得到解决了,能不能出来给个提示啊。
& & & &要是在VBS中确实没有办法解决,下一步准备在C中用API调用试一下,可是那对我来说太难了,痛苦啊痛苦啊………
& 偶然在微软网站上发现了此问题的解决方法:
& 下载一个ADS.DLL,注册; && VDS.DLL的下载地址是:
& 在WINCC中用VBS脚本,比如:
发表于: 13:24:12 |下次自动登录
现在的位置:
& 综合 & 正文
Delphi+MSComm控件串口收发程序
//Delphi+MSComm控件串口收发程序
procedure TForm1.FormCreate(Sender: TObject);
if MSComm1.PortOpen then MSComm1.PortOpen :=//关闭端口
MSComm1.CommPort := 2;//设置端口2
MSComm1.InBufferSize := 256;//设置接收缓冲区为256个字节
MSComm1.OutBufferSize := 256;//设置发送缓冲区为256个字节
MSComm1.Settings := '9600,n,8,1';//9600波特率,无校验,8位数据位,1位停止位
MSComm1.InputLen := 0;//读取缓冲区全部内容(32个字节)
MSComm1.InBufferCount := 0;// 清除接收缓冲区
MSComm1.OutBufferCount:=0;// 清除发送缓冲区
MSComm1.RThreshold := 32;//设置接收32个字节产生OnComm 事件
// MSComm1.InputMode := comInputModeT//文本方式
MSComm1.InputMode := comInputModeB//二进制方式
MSComm1.PortOpen :=//打开端口
procedure TForm1.FormCloseQuery(Sender: TO var CanClose: Boolean);
if MSComm1.PortOpen then MSComm1.PortOpen :=;//关闭端口
procedure TForm1.MSComm1Comm(Sender: TObject);
buffer: O//MSComm1.InputMode = comInputModeBinary
str://MSComm1.InputMode = comInputModeText
case MSComm1.CommEvent of
comEvReceive: //串行接收事件处理
if MSComm1.InputMode = comInputModeText then //字符方式读取
str := MSComm1.Input//读出后会自动清除接收缓冲区,str[1]~str[32]
else //二进制方式读取
buffer := MSComm1.I//读出后会自动清除接收缓冲区,buffer[0]~buffer[31]
Edit3.Text := '';
for i := 0 to MSComm1.RThreshold - 1 do //32字节Hex转换
if MSComm1.InputMode = comInputModeText then //单行字符转换
Edit3.Text := Edit3.Text + inttohex(byte(str[i + 1]), 2) + ' '
else //单行二进制数据转换
Edit3.Text := Edit3.Text + inttohex(buffer[i], 2) + ' ';
Memo2.Lines.Add(Edit3.Text);//加入一行显示
procedure TForm1.BitBtn1Click(Sender: TObject);
Edit4.Text := '';
for i := 0 to 31 do
MSComm1.Output := char(i);//发送一个字符
Edit4.Text := Edit4.Text + inttohex(i, 2);//以十六进制字符显示
Memo1.Lines.Add(Edit4.Text);//加入一行显示
【上篇】【下篇】mscomm32.ocx 兼容win7 64位(mscomm32串口状态获取)附注册方法
mscomm32.ocx下载
DLL大小:53KB
DLL语言:简体中文
DLL授权:免费软件
更新时间:
DLL类别:其它
应用平台:
网友评分:
内容介绍热点排行下载地址相关文章
这三个文件主要是用来解决安装office2007时提示windows installer 服务不能更新一个或多个受保护的windows文件问题解决rtl60.bplrtl70.bpl 7.0.4.453
电脑突然上不了网,说是找不到netcfg.hlp文件,可以下这个运行一下解决
已经增加netcfg.hlp,还是不能用的朋友请下载netcfg.exe,它自动帮你放到系统里
stdole32.tlbDynaPass32.exerundll32.exe开机后在要进入系统的时候提示c:\windows\system32\drivers\pci.sys 丢失usbaapl.sys都是一些基于c++开发游戏必备的一些dll文件,直接复制到游戏目录里面即可
下载错误?
mscomm32.ocx 兼容win7 64位(mscomm32串口状态获取)附注册方法

我要回帖

更多关于 串口通信编程 的文章

 

随机推荐