深入浅出vc串口编程
① 关于VC++串口编程接收数据的问题
你不建工程直接编译,vc会帮你建立一个工程的。所以在编译第二个程序的时候,先选择“file
|
close
workspace”把前一个程序的工作区关掉,这样就不会有影响了。
② vc++串口编程
我这里有例子
怎么给你呢
给你一个简单的初始化串口的代码:
HANDLE
hCom=CreateFile("COM2",
GENERIC_READ|GENERIC_WRITE,0,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("打开COM失败!");
return
FALSE;
}
SetupComm(hCom,1024,1024);
COMMTIMEOUTS
TimeOuts;
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts);
//设置超时
DCB
dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600;
//波特率为9600
dcb.ByteSize=8;
//每个字节有8位
dcb.Parity=NOPARITY;
//无奇偶校验位
dcb.StopBits=1;
//1个停止位
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
////////////////////////////////////////////////
CKeyBoardDlg::EnableWindow(false);
③ VC++串口编程问题
在MSDN中帮你查了一下,好像需要一个LicenseKey。
另外,在C++中我们一般用::CreateFile API 函数打开串口,自己读,如果需要我可以给你我读取串口的方法。
/*
Copyright (c) 1994
*/
WCHAR pwchLicenseKey[] =
{
0x0043, 0x006F, 0x0070, 0x0079, 0x0072, 0x0069,
0x0067, 0x0068, 0x0074, 0x0020, 0x0028, 0x0063,
0x0029, 0x0020, 0x0031, 0x0039, 0x0039, 0x0034,
0x0020
};
// Create the license string
BSTR bStrLicense = ::SysAllocStringLen(pwchLicenseKey,
sizeof(pwchLicenseKey)/sizeof(WCHAR));
// Create the CMSComm object with run-time license data
CMSComm * pComm = new CMSComm;
pComm->Create(NULL, WS_VISIBLE, CRect(0,0,0,0),
this, 999, NULL, FALSE, bStrLicense);
④ 如何用VC进行串口编程
1、新建MFC对话框工程如下
双击两个Button按钮;
代码中显示如下:
[cpp] view plain print?
voidCMSCommTestDlg::OnBnClickedBtnopen()
{
//TODO:
}
voidCMSCommTestDlg::OnBnClickedBtnsend()
{
//TODO:
}
voidCMSCommTestDlg::OnOncommMscomm1()
{
//TODO:Addyourmessagehandlercodehere
}
- void CMSCommTestDlg::OnBnClickedBtnopen()
- {
- // TODO: Add your control notification handler code here
- }
- void CMSCommTestDlg::OnBnClickedBtnsend()
- {
- // TODO: Add your control notification handler code here
- }
- void CMSCommTestDlg::OnOncommMscomm1()
- {
- // TODO: Add your message handler code here
- }
voidCMSCommTestDlg::OnClickedBtnopen()
{
//TODO:
//如果端口已经开启,那么先关闭
if(m_comm1.get_PortOpen())
{
m_comm1.put_PortOpen(FALSE);
}
m_comm1.put_CommPort(3);//选择com3,可以根据具体情况更改
m_comm1.put_InBufferSize(1024);//设置输入缓冲区的大小,Bytes
m_comm1.put_OutBufferSize(1024);//设置输出缓冲区的大小,Bytes
m_comm1.put_Settings(_T("9600,n,8,1"));//波特率9600,无校验,8个数据位,停止位1
m_comm1.put_InputMode(1);//1:表示以二进制方式检索数据
m_comm1.put_RThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_comm1.put_InputLen(0);//设置当前接收区长度是0
if(!m_comm1.get_PortOpen())
{
m_comm1.put_PortOpen(TRUE);
}
else
{
AfxMessageBox(_T("Cannotopenserialport!"));
}
m_comm1.get_Input();//先预读缓冲区以清除残留数据
UpdateData(FALSE);
}
voidCMSCommTestDlg::OnClickedBtnsend()
{
//TODO:
UpdateData(TRUE);
m_comm1.put_Output(COleVariant(m_sTXDATA));//发送数据
}
voidCMSCommTestDlg::OnOncommMscomm1()
{
//TODO:Addyourmessagehandlercodehere
VARIANTvariant_inp;
COleSafeArraysafearray_inp;
LONGlen,k;
BYTErxdata[2048];
CStringstrtemp;
if(m_comm1.get_CommEvent()==2)//事件值为2表示缓冲区内有字符
{
variant_inp=m_comm1.get_Input();//读缓冲区
safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetDim();//得到有效数据长度
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
}
for(k=0;k<len;k++)//将数组转换为CString型变量
{
BYTEbt=*(char*)(rxdata+k);//字符型
strtemp.Format(_T("%c"),bt);//将字符送入临时变量strtemp存放
m_sRXDATA+=strtemp;//接收到的数据放到编辑框对应的变量中
}
}
SetDlgItemText(IDC_EDIT_RXDATA,m_sRXDATA);
}
5、将上面代码补全如下:
[cpp] view plain print?
⑤ 推荐一本关于VC串口通信,以及上位机编程的书,最好有视频教程
一致推荐
Visual C++_Turbo C串口通信编程实践
⑥ 用VC++编写一个串口通信程序,借助串口调试助手来完成收发。程序中的串口号和串口助手中串口号必须一致吗
你用VC++编写的程序实际上与串口助手的功能类似,如果串口号设置一致会导致冲突。
例如你先开了自己的程序,打开串口com3,然后再开串口助手设置相同的串口号通常会被提示“串口已打开”或者类似被占用什么的……记不清了。
如果非要用串口助手调试,请确保你的计算机有两个串口接口,分别把自己的程序和串口助手设置为不同串口号,再在硬件上将这两个串口的输出与输入、输入与输出联通,那么就可以调试了。
麻烦一点的可以用两台电脑进行调试。
⑦ 用VC++编程串口的话 程序写出来应该放在什么工具里运行的
没有明白你的意思!
你编程序是用来干什么呢?
⑧ 一个VC++程序同时持续读取两个串口的数据,给个思路吧,谢谢!
多线程实现串口,可以用api实现,
深入浅出Win32多线程程序设计之综合实例,
http://tech.163.com/05/1223/10/25LABDP00009159F_4.html
这篇不错的,可以给思路
⑨ 关于串口调试助手VC源程序及详细编程过程
这样你每接受一个字符,如:strtemp.Format("%X",bt); 就把这个字符串的没一位转换成十进制,然后,把第一个十进制左移4位,然后加上后一个十进制数字,得出的结果也就是你要的数字,这个方法我测试过,一定行的
注意:你这个for(k=0;k<len;k++) 循环,每循环一次就接收一个字符,你只要每接收一个字符后,按我上面的方法转换,得到的值就一顶是你相应16进制转换成10进制的值,哈哈哈哈
⑩ visual c++ 串口编程 初学,求救
给你点代码
void Com::init_com_interface()
{
hcom = CreateFile("COM1", // communication port string (COMX)
GENERIC_READ | GENERIC_WRITE, // read/write types
0, // comm devices must be opened with exclusive access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // Async I/O
NULL); // template must be 0 for comm devices
DCB dcb;
COMMTIMEOUTS tout;
GetCommState(hcom,&dcb);
dcb.BaudRate = 115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
SetCommState(hcom,&dcb);
tout.ReadTotalTimeoutConstant = 0;
tout.WriteTotalTimeoutConstant = 0;
tout.WriteTotalTimeoutMultiplier = 0;
tout.ReadTotalTimeoutMultiplier = 0;
tout.ReadIntervalTimeout = -1;
SetCommTimeouts(hcom,&tout);
//DWORD len;
//if (!ReadFile(hcom,rxbuf,200,&len,NULL))
//{
// return FALSE;
//}
//else return TRUE;
}
以上是串口初始化代码
以下是发送字符串代码
void Com::SendCommand(CString str)
{
CString m_vHexshow="";
//mm[1]=100;
// m_vStaticFasong=str;
// m_vEditJieshou="";
// UpdateData(FALSE);
str.MakeLower();
int m=0,n=0,mn=0;
for(int i=0;i<str.GetLength();i+=3)
{
m=(str[i]<58)?(str[i]-48):(str[i]-87);
n=(str[i+1]<58)?(str[i+1]-48):(str[i+1]-87);
mn=m*16+n;
//if(mn==239)
//
m_vHexshow+= char(mn);
}
//
//if (m_vHexshow[0]==-17)
memcpy(txbuf,m_vHexshow,m_vHexshow.GetLength());
//if (txbuf[0]==239)
DWORD len;
if (!WriteFile(hcom,txbuf,m_vHexshow.GetLength(),&len,NULL))
{
}
}