串口通信

串口通信

波特率:每秒发送的比特位

很少用串口传送文件,因为速度太慢了,主要完成控制和检测

 

添加ActiveX控件Microsoft Communitions Control

 

串口通信和网络通信一样,需要一直监听是否有数据来了

 

程序采用一个通用的多串口多线程类CSerialPortEx来处理底层串口通信细节

按照自定义串口通信协议SPCP建立连接,实现数据的传输功能

串行端口的本质功能是作为CPU和串行设备间的编码转换器

 

vs中删除资源应在基类的OnDestroy之前,否则可能会出错

 

error LNK2001: 无法解析的外部符号 "public: virtual struct CRuntimeClass * __,查看解决方案里面是不是某个文件丢失了

 

在for循环条件中定义的变量,出了for循环,就出了作用域

 

 

VC添加串口程序:

1.添加MSComm控件:

Project->Add To Project->Component and Controls

在弹出的对话框中“Component and Controls Gallery”中选Microsoft Communication Controls Version 6.0

 

2.设置串口:

if(m_Comm.GetPortOpen())

{

m_SetPortOpen(false);//设置串口配置信息前先关闭串口

}

m_Comm.SetCommPort(1); //com1串行口

m_Comm.Settings("9600,n,8,1"); //设置波特率为9600,无奇偶校验,数据位8位,停止位1位

m_Comm.SetInputMode(1); //设置数据通讯格式为二进制数组格式

m_Comm.setThreashold(1); //设置每次收到一个字节数据就触发OnComm事件

if(!m_comm.GetPortOpen())

{

m_Comm.SetPortOpen(TRUE);

}

m_CommGetInput(); //清除串口输入缓冲区中残留的数据

 

3.添加发送过程:

m_Comm.SetOutput(COleVariant(m_Array))//m_Array为字节数组CByteArray

4.添加接收数据消息:

int nEvent = m_Comm.GetCommEvent();

switch(nEvent)

{

case 2:

{

len = m_Comm.GetInBufferCount();

if(len > 0)

{

m_input = m_Comm.GetInput();

char * str = (char*)(unsigned char *)m_input.parray->pvData;

}

*(str + len) = '\0';

}

}

 

 

 

vs2005中实现串口通信:

1.添加ActiveX控件:

选中资源对话框,在右键菜单中选中“插入ActiveX控件”

2.添加CMSMComm类

选中类视图,右键菜单选择“添加类”

在对话框中选择“ActiveX控件中的MFC类”,点击添加

3.定义CMSComm类型变量

4.设置CMSComm变量

m_Comm.put_CommPort(1) //选择串口

m_Comm.put_Setttings(_T("9600,n,8,1")) //设置波特率等参数

m_Comm.put_RThreshold(1) //接收1个字节后产生事件

m_Comm.put_InputMode(1) //设置输入方式为二进制

m_Comm.put_InBufferSize(1024) //设置输入缓冲区大小

m_Comm.put_OutBufferSize(512) //设置输出缓冲区大小

 

m_Comm.get_PortOpen() //查看端口是否打开

m_Comm.put_PortOpen(true) //打开端口

 

5.添加OnCommMscomm1消息事件,当接受缓冲区有数据时,会触发此事件

事件2是接收数据

 

COleSafeArray safearray;

char rxdata[1000];

 

switch(m_Comm.get_CommEvent()) //得到事件类型

{

case 2:

{

safearray = m_Comm.get_Input(); //得到缓冲区数据

int len;

long i;

len = safearray.GetOneDimSize(); //得到数组大小

for(long i = 0;i<len;i++)

{

safearray.GetElement(&i,&rxdata[i]); //得到数组第i的元素

}

rxdata[i] = '\0';

}

}

 

6.添加发送过程

int count = strSend.GetLength();

CByteArray Array;

for(int i=0;i<count;i++)

{

Array.SetAt(i,strSend[i]);

}

m_Comm.put_Output(COleSafeArray(Array));

 

 

 

 

 

posted on 2014-03-11 23:34  DaMengZhang  阅读(573)  评论(0编辑  收藏  举报