深入淺出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))
{
}
}