由于最近做关于IC卡方面的,不免涉及到串口与单片机的通信。上网查找了很久,又看了很久相关的书,有了初步的“形状”,怎么这么说呢?界面做出来了,电脑与电脑之间的通信也行了。但就是与单片机的通信还有点问题,不知是上位机的问题还是下位机的程序的问题,也难找到头绪。
上位机是用VC写的,从放假到现在都在看VC的书,才略懂MFC与用API函数编程的区别,以及常用控件的用法。下面把一些代码贴出来:
初始化串口代码:
m_ctrMSComm.SetCommPort(3); //这里是在程序中打开串口,COM3虚拟者也
m_ctrMSComm.SetInBufferSize(1024); //接收缓冲区1024
m_ctrMSComm.SetOutBufferSize(512); //发送缓冲区512
if (!m_ctrMSComm.GetPortOpen()) //判断是否打开了串口.
{
m_ctrMSComm.SetPortOpen(TRUE);
}
m_ctrMSComm.SetInputMode(1); //二进制格式.
m_ctrMSComm.SetSettings("9600,n,8,1"); //波特率9600无检验位,8个数据位,1个停止位 m_ctrMSComm.SetRThreshold(1); // 接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件m_ctrMSComm.SetInputLen(0); //设置当前接收区数据长度为0,表示全部读取
发送字符串代码:
UpdateData(TRUE);
CByteArray sendArr;
WORD wLength;
wLength = m_Send.GetLength();
sendArr.SetSize(wLength);
for(int i =0; i {
sendArr.SetAt(i, m_Send.GetAt(i)); //此处是m_Send的内容!!
}
m_ctrMSComm.SetOutput(COleVariant(sendArr));
接收事件代码:
UpdateData(TRUE);
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG i = 0;
int len;
BYTE rxdData[2048]; //data receive;
CString tmpData; //temp data;
switch (m_ctrMSComm.GetCommEvent())
{
case 1:
break;
case 2: //这个是GetCommEvent事件的返回值 2表示接收缓冲区有字符.
variant_inp = m_ctrMSComm.GetInput(); //接收
safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize(); //获得读取数据的CString类型的长度 有效者也
for (i = 0; i < len; i++)
{
/* safearray_inp.GetElement(&i,&rxdData[i]);
//safearray_inp.GetElement(&i,rxdData + i); //应该是接收数据 ??
BYTE bt = *(char*)(rxdData+i);
tmpData.Format("%c",bt);
//--test!!----
// MessageBox(tmpData);
// m_Recv += tmpData;*/
safearray_inp.GetElement(&i,rxdData + i);
BYTE bt =* (char*)(rxdData+i);
tmpData.Format("%c",bt);
m_Recv += tmpData;
}
/* rxdData[i] = '\0'; //结束符
m_Recv += rxdData; */
m_Recv += "\r\n"; //每次接收完一串字符,换行.必须用"\r\n"!!!
UpdateData(FALSE);
break;
default: //传输事件出错
m_ctrMSComm.SetOutBufferCount(0);
break;
}
下面图片是写出来的程序与串口调试助手之间的通信。其中用的是虚拟串口,COM3与COM4.
阅读(894) | 评论(0) | 转发(0) |