當前位置:首頁 » 編程軟體 » 深入淺出vc串口編程

深入淺出vc串口編程

發布時間: 2022-02-16 06:43:41

① 關於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

  • }


  • 5、將上面代碼補全如下:

    [cpp] view plain print?

  • 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);

  • }

⑤ 推薦一本關於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))
{
}
}

熱點內容
如何進入安卓原生市場 發布:2025-01-14 18:22:06 瀏覽:557
台式電腦找不到伺服器 發布:2025-01-14 18:19:58 瀏覽:422
androidsdk網盤 發布:2025-01-14 18:17:43 瀏覽:79
個別用戶訪問不了騰訊雲伺服器 發布:2025-01-14 18:03:27 瀏覽:276
oracle鏈接sqlserver 發布:2025-01-14 17:58:33 瀏覽:729
sql完全手冊 發布:2025-01-14 17:53:03 瀏覽:248
幻三腳本下 發布:2025-01-14 17:20:20 瀏覽:910
我的世界基岩版如何創自己的伺服器 發布:2025-01-14 17:15:01 瀏覽:329
花果演算法 發布:2025-01-14 17:09:57 瀏覽:775
c語言輸出格式符 發布:2025-01-14 17:09:12 瀏覽:537