串口通信
波特率:每秒发送的比特位
很少用串口传送文件,因为速度太慢了,主要完成控制和检测
添加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) = ' ';
}
}
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] = ' ';
}
}
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));