欢迎来到天天文库
浏览记录
ID:25904439
大小:63.50 KB
页数:7页
时间:2018-11-23
《mscomm控件在中文windows下的通信问题》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、MSComm控件在中文Windows下的通信问题摘要VB5.0/6.0的MSm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,但在实际通信软件设计过程中,MSm控件并非像想像中那样完美和容易控制,特别是在中文sm控件串口通信处理1.MSm控件的基础理论一般说来,计算机都有一个或多个串行端口,它们依次为1、2、...。这些串口还提供了外部设备与PC进行数据传输和通信的通道,这些串口在CPU和外设之间充当解释器的角色。当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接
2、收数据时,比特流数据被转换为字符数据传递给CPU。再进一步说,在操作系统方面,icrosoftmcontrol5.0组件,在窗体Form1中加入mand命令按钮并取名为cmdTest,MSm控件取名为MSm1,写入以下代码:PrivateSubcmdTest_Click()MSm1.mPort=1'设定1口IfMSm1.PortOpen=FalseThenMSm1.Settings="9600,N,8,1"'9600波特率,无校验,8位数据位,1位停止位MSm1.PortOpen=True'打开串口
3、EndIfMSm1.OutBufferCount=0'清空发送缓冲区MSm1.InBufferCount=0'清空接收缓冲区'发送字符数据,注意必须用回车符(vbCr)结束MSm1.Output="Thisisagoodbook!"vbCr'拨打号码或发送AT命令MSm1.Output="ATDT0294563622"vbCr'发送字符数组数据,注意ByteArray必须事先定义赋值DimByteArrayasbyte()'定义动态数组ReDimByteArray(1)'重定义数组大小ByteArr
4、ay(0)=0ByteArray(1)=1MSm1.Output=ByteArray'发送字符数组数据EndSubPrivateSubMSm1_Onm()SelectCaseMSm1.mEventCaseEvReceive'接收字符数据DimBufferAsVariantMSm1.InputLen=0'当InputMode属性值为0(文本模式)时,变量中含String型数据。'当InputMode属性值为1(二进制模式)时,变量中含Byte型数组数据。MSm1.InputMode=InputMode
5、BinaryBuffer=MSm1.Input'接收二进制数据MSm1.InputMode=InputModeTextBuffer=MSm1.InputCaseelseEndSelectEndSub3.中文Sm32.OCX中存在一个影响传输二进制数据的Bug。32位ultiplierAsLongReadTotalTimeoutConstantAsLongultiplierAsLongTIMEOUTS)AsLongDeclareFunctionGetmTimeoutsLib"Kernel32"(ByV
6、alhFileAsLong,_lpmTimeoutsAsMTIMEOUTS)AsLongDimtimeoutsAsMTIMEOUTSDimRetAsLongIfm1.PortOpen=FalseThenm1.PortOpen=TrueEndIf'打开串口后重新设定串口句柄Ret=GetmTimeouts(m1.mID,timeouts)'Setsomedefaulttimeoutstimeouts.ReadIntervalTimeout=1timeouts.ReadTotalTimeoutMulti
7、plier=1timeouts.ReadTotalTimeoutConstant=1timeouts.ultiplier=1timeouts.Sm1.Output=chr(i)Nexti希望在接收端得到预期的0-255之间的数据,结果却是:前129个数据接收正确,为0-128,后面127个数据为126个0和一个255。造成这种结果的原因在于中文yData(255)AsByteFori=0To255MyData(i)=iNextiMSm1.Output=MyDataDoDoEventsLoopUnti
8、lMSm1.OutBufferCount=0'接收过程PrivateSubMSm1_Onm()SelectCaseMSm1.mEventCaseEvReceiveDimBufferAsVariantMSm1.InputMode=InputModeBinaryMSm1.InputLen=0Buffer=MSm1.InputFori=LBound(Buffer)ToUBound(Buffer)Text1.Text=Buffer(i);NextiCaseElseEndSel
此文档下载收益归作者所有