① 【急求】mfc 實現串口編程的源代碼
1.建立項目:打開VC++6.0,建立一個基於對話框的MFC應用程序SCommTest(與我源代碼一致,等會你會方便一點);
2.在項目中插入MSComm控制項 選擇Project菜單下Add To Project子菜單中的 Components and Controls…選項,在彈出的對話框中雙擊Registered ActiveX Controls項(稍等一會,這個過程較慢),則所有注冊過的ActiveX控制項出現在列表框中。 選擇Microsoft Communications Control, version 6.0,,單擊Insert按鈕將它插入到我們的Project中來,接受預設的選項。(如果你在控制項列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安裝VC6時沒有把ActiveX一項選上,重新安裝VC6,選上ActiveX就可以了),
這時在ClassView視窗中就可以看到CMSComm類了,(注意:此類在ClassWizard中看不到,重構clw文件也一樣),並且在控制項工具欄Controls中出現了電話圖標(如圖1所示),現在要做的是用滑鼠將此圖標拖到對話框中,程序運行後,這個圖標是看不到的。
3.利用ClassWizard定義CMSComm類控制對象 打開ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類,為IDC_MSCOMM1添加控制變數:m_ctrlComm,這時你可以看一看,在對話框頭文件中自動加入了//{{AFX_INCLUDES() #i nclude "mscomm.h" //}}AFX_INCLUDES (這時運行程序,如果有錯,那就再從頭開始)。
4.在對話框中添加控制項 向主對話框中添加兩個編輯框,一個用於接收顯示數據ID為IDC_EDIT_RXDATA,另一個用於輸入發送數據,ID為IDC_EDIT_TXDATA,再添加一個按鈕,功能是按一次就把發送編輯框中的內容發送一次,將其ID設為IDC_BUTTON_MANUALSEND。別忘記了將接收編輯框的Properties->Styles中把Miltiline和Vertical Scroll屬性選上,發送編輯框若你想輸入多行文字,也可選上Miltiline。
再打開ClassWizard->Member Viariables選項卡,選擇CSCommTestDlg類, 為IDC_EDIT_RXDATA添加CString變數m_strRXData, 為IDC_EDIT_TXDATA添加CString變數m_strTXData。說明: m_strRXData和m_strTXData分別用來放入接收和發送的字元數據。
5.添加串口事件消息處理函數OnComm() 打開ClassWizard->Message Maps,選擇類CSCommTestDlg,選擇IDC_MSCOMM1,雙擊消息OnComm,將彈出的對話框中將函數名改為OnComm,(好記而已)OK。
這個函數是用來處理串口消息事件的,如每當串口接收到數據,就會產生一個串口接收數據緩沖區中有字元的消息事件,我們剛才添加的函數就會執行,我們在OnComm()函數加入相應的處理代碼就能實現自已想要的功能了。請你在函數中加入如下代碼:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設置BYTE數組 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值為2表示接收緩沖區內有字元
{ ////////以下你可以根據自己的通信協議加入處理代碼
variant_inp=m_ctrlComm.GetInput(); //讀緩沖區
safearray_inp=variant_inp; //VARIANT型變數轉換為ColeSafeArray型變數
len=safearray_inp.GetOneDimSize(); //得到有效數據長度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數組
for(k=0;k<len;k++) //將數組轉換為Cstring型變數
{
BYTE bt=*(char*)(rxdata+k); //字元型
strtemp.Format("%c",bt); //將字元送入臨時變數strtemp存放
m_strRXData+=strtemp; //加入接收編輯框對應字元串
}
}
UpdateData(FALSE); //更新編輯框內容
}
到目前為止還不能在接收編輯框中看到數據,因為我們還沒有打開串口,但運行程序不應該有任何錯誤,不然,你肯定哪兒沒看仔細,因為我是打開VC6對照著做一步寫一行的,運行試試。沒錯吧?那麼做下一步:
6.打開串口和設置串口參數 你可以在你需要的時候打開串口,例如在程序中做一個開始按鈕,在該按鈕的處理函數中打開串口。現在我們在主對話框的CSCommTestDlg::OnInitDialog()打開串口,加入如下代碼:
// TODO: Add extra initialization here
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1); //選擇com1
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打開串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,無校驗,8個數據位,1個停止位
m_ctrlComm.SetInputMode(1); //1:表示以二進制方式檢取數據
m_ctrlComm.SetRThreshold(1);
//參數1表示每當串口接收緩沖區中有多於或等於1個字元時將引發一個接收數據的OnComm事件
m_ctrlComm.SetInputLen(0); //設置當前接收區數據長度為0
m_ctrlComm.GetInput();//先預讀緩沖區以清除殘留數據
現在你可以試試程序了,將串口線接好後,打開串口調試助手,並將串口設在com2,選上自動發送,也可以等會手動發送。再執行你編寫的程序,接收框里應該有數據顯示了。
7.發送數據 先為發送按鈕添加一個單擊消息即BN_CLICKED處理函數,打開ClassWizard->Message Maps,選擇類CSCommTestDlg,選擇IDC_BUTTON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend()函數,並在函數中添加如下代碼:
void CSCommTestDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //讀取編輯框內容
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//發送數據
}
運行程序,在發送編輯框中隨意輸入點什麼,單擊發送按鈕,我們通過把RS232的2.3兩口短接,在一台電腦上顯示串口的收發數據!
最後說明一下,由於用到VC控制項,在沒有安裝VC的計算機上運行時要從VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目錄下的System子目錄中(win2000為System32)並再進行注冊設置
② WinCE下如何MFC程序調用串口
僅供參考:
1、使用現有的mscome控制項進行相關串口操作
2、具體示例可以參照網上的許多的
③ MFC串口編程中發送數據函數的疑問
關於「構造函數沒有返回值」,
請注意: m_mscomm.put_Output調用的參數不是COleVariant的返回值, 而是一個COleVariant類的實例。
這樣,m_mscomm.put_Output函數中,可以調用COleVariant中的函數或公用變數。
而構造函數則將變數存入至COleVariant類中, 供m_mscomm.put_Output函數調用。
④ MFC下串口通信程序, 接收不到數據
最好用線程來接受程序
static UINT RevThreadProc2(LPVOID pParam)
{
HANDLEh_gEvent;
DWORDdwBytesRead;
OVERLAPPEDOverlapped;
BOOL bReadStatus = FALSE;
dwBytesRead = 0;
//MessageBox("abc");
memset(&Overlapped,0,sizeof(OVERLAPPED));
h_gEvent = NULL;
h_gEvent = CreateEvent(
NULL,
TRUE,//手工設置事件有無信號
FALSE,//初始化事件為無信號狀態
NULL//無名事件對像
);
if(h_gEvent == NULL) return 0;
Overlapped.hEvent = h_gEvent;//指定一個I/O操作完成後觸發的事件
BYTE data[COM_BUFSIZE];
ZeroMemory(data,COM_BUFSIZE);
DWORD dwEvtMask=0;
GetCommMask(g_pMainDlg->m_Io0.m_hHandle,&dwEvtMask);
dwEvtMask |=EV_RXCHAR;
SetCommMask(g_pMainDlg->m_Io0.m_hHandle,dwEvtMask);
while(g_pMainDlg->m_Io0.m_hHandle)
{
WaitCommEvent(g_pMainDlg->m_Io0.m_hHandle,&dwEvtMask,NULL);
if (g_pMainDlg->m_Io0.m_hHandle == INVALID_HANDLE_VALUE)
{
return 0;
}
if ((dwEvtMask&EV_RXCHAR) == EV_RXCHAR)
{
COMSTAT ComStat ;
DWORD dwLength,dwErrorFlags;
ClearCommError(g_pMainDlg->m_Io0.m_hHandle, &dwErrorFlags, &ComStat ) ;
dwLength = ComStat.cbInQue ; //輸入緩沖區接收了多少數據?
if (dwLength > 0)
{
//AfxMessageBox("RevThreadProc2");
bReadStatus = ReadFile( g_pMainDlg->m_Io0.m_hHandle, data,dwLength, &dwBytesRead, &Overlapped);
if(!bReadStatus)
{
if(GetLastError()==ERROR_IO_PENDING)
{
while(!GetOverlappedResult(g_pMainDlg->m_Io0.m_hHandle,
&Overlapped, &dwBytesRead, TRUE ))
{
if(GetLastError() == ERROR_IO_INCOMPLETE)
continue;
}
for(DWORD i = 0;i<dwBytesRead;i++)
{
g_pMainDlg->m_RevData[rec_pos_lineless] = data[i];
rec_pos_lineless++;
}
if (rec_pos_lineless >= 5)
{
SetStudentUpDownFromCom(g_pMainDlg->m_RevData,rec_pos_lineless);
rec_pos_lineless = 0;
}
}
}
else
{
for(DWORD i = 0;i<dwBytesRead;i++)
{
g_pMainDlg->m_RevData[rec_pos_lineless] = data[i];
if (data[i] == 144 || data[i] == 80 ||data[i] == 255)
{
bvn++;
}
rec_pos_lineless++;
}
if (bvn >= 3)
{
、、、、、、、、處理接受到的數據
bvn =0;
rec_pos_lineless = 0;
}
}
}
}
}
ExitThread(0);
CloseHandle(h_gEvent);//讀取時的OS
return 0;
}
這個是我寫的一個線程,可以接受的,希望對你有用
⑤ MFC 用serialport類進行串口通信的編程,求具體操作步驟...
MFC 用serialport類進行串口通信的編程,求具體操作步驟...
本書里不是有 嗎?
Visual C++_Turbo C串口通信編程實踐
匿名 <span class="tm">5-26 16:55</span>
</p>
<div class="b bt2"><div class="bt bg1 ft"><img alt="其他答案" height="16" src="/static/img/ico2.gif" width="16"/>其他答案</div></div>
<p class="ft bb">建議看龔建偉的Visual+C++_Turbo+C串口通信編程實踐.pdf。上面有源代碼
匿名 <span class="tm">5-27 18:54</span>
</p>
<p class="ft p1">如果要的話,我發給你,QQ:1016267793
五湖四海皆春色 萬水千山盡得輝 萬象更新
⑥ MFC串口通訊編程,不會但是必須做,網上東拼西湊之後顯示亂碼,還是沒有達到任務要求。求助:串口通信問題
ReadFile就相當於fread,你隨便讀個txt文件先試試就知道怎麼用了。亂碼有可能是你lplnBuffer所指的緩沖區結尾沒有」\0「的原因也可能是你工程字元集是Unicode位元組的問題改成多位元組看看。
寫串口通信最簡單的辦法直接用現成的com組件,網路一下Mscomn很多例子的
⑦ MFC 用serialport類進行串口通信的編程,求具體操作步驟,代碼詳解。
建議看龔建偉的Visual+C++_Turbo+C串口通信編程實踐.pdf。上面有源代碼
⑧ 用MFC怎麼做串口測試程序,我要詳細步聚!!!!!!!!
添加一個mscomm 控制項裡面有,然後設置它的波特率,波特率和下位機的波特率要一致。然後就用
Write和Read方法讀寫數據就行了。
推薦關於MSCOMM控制項的一些說明
VB5.0/6.的MSComm通信控制項提供了一系列標准通信命令的介面,它允許建立串口連接,可以連接到其他通信設備(如Modem).
還可以發送命令、進行數據交換以及監視和響應在通信過程中可能發生的各種錯誤和事件,從而可以用它創建全雙工 、事件驅
動的、高效實用的通信程序。但在實際通信軟體設計過程中,MSComm控制項並非像想像中那樣完美和容易控制.特別是在中文Wln
95/98下通信時更會出現問題。下面就從基礎開始介紹,然後逐步討淪MSComm控制項在編程中出現的問題以及編程技巧。
一、用MSComm控制項通信
1.串口通信基礎知識
一般悅來,計算機都有一個或多個串列埠,它們依次為com1、Com2、…,這些串口還提供了外部設備與pC進行數據傳輸和
皿信的通道。這些串口在CPU和外設之間充當解釋器的角色。當字元數據從CPU發送給外設時,這些字元數據將被轉換成串列比特
流數據;當接收數據時,比特流數據被轉換為字元數據傳遞給CPU,再進一步說,在操作系統方面,Windows用通信驅動程序
(COMM.DRV)調用API函數發送和接收數據,當用通信控制項或聲明調用API函數時,它門由COMM. DRV解釋並傳遞給設備驅動程序,
作為一個vB程序員,要編寫通信程序.只需知道通信控制項提供給Windows通信AP1函數的介面即可.換句話說,只需設定和監視通
信控制項的屬性和事件即可。
2.使用Mscomm控制項
在開始使用MSComm控制項之前。需要先了解其屬性、事件或錯誤
屬性 描述
CommPort 設置或返回通信埠號
Settings 以字元串的形式設置或返回波特率、奇偶校驗、數據位和停止位
PortOpen 設置或返回通信埠的狀態。也可以打開和關閉埠
Input 返回和刪除接收緩沖區中的字元
Output 將字元串寫入發送緩沖區
CommEvent屬性為通信事件或錯誤返回下列值之一。在該控制項的對象庫中也可以找到這些常量。
常量 值 描述
ComEventBreak 1001 收到了斷開信號
ComEventCTSTO 1002 Clear To Send Timeout。在發送字元時,在系統指定的事1件內,CTS(Clear To Send)線是低電平
ComEventDSRTO 1003 Data Set Ready Timeout。在發送字元時,在系統指定的事件內,DSR(Data Set Ready)線是低電平
ComEventFrame 1004 數據幀錯誤。硬體檢測到一個數據幀錯誤
ComEventOverrun 1006 埠溢出。硬體中的字元尚未讀,下一個字元又到達,並且丟失
ComEventCDTO 1007 Carrier Detect Time。在發送字元時,在系統指定的事件內,CD(Carrier Detect)線是低電平。CD
也稱為RLSD(Receive Line Singal Detect,接收線信號檢測)
ComEventRxOver 1008 接收緩沖區溢出。在接收緩沖區中沒有空間
ComEventRxParity 1009 奇偶校驗錯。硬體檢測到奇偶校驗錯誤7
ComEventTxFull 1010 發送緩沖區滿。在對發送字元排隊時,發送緩沖區滿
ComEventDCB 1011 檢取埠DCB(Device Control Blick)時發生了沒有預料到的錯誤
通信事件包含了下面的設置:
常量 值 描述
ComEvSend 1 發送緩沖區中的字元數比Sthreshold值低
ComEvReceive 2 接收到了Rthreshold個字元。持續產生該事件,直到使用了Input屬性刪除了接收緩沖區中的數據
ComEvCTS 3 CTS(Clear To Send)線改變
ComEvDSR 4 DSR(Data Set Ready)線改變。當DSR從1到0改變時,該事件發生
ComEvCD 5 CD(Carrier Detect)線改變ComEvRing6檢測到響鈴信號。一些URAT(Universal AsynchronousReciver-
-Transmitters,通用非同步收發器)不支持該事件
ComEvEOF 7 收到了EOF字元(ASCII字元26)
Error消息(MSComm控制項)下表列出了MSComm控制項可捕獲的錯誤消息:
常量 值 描述
ComInvalidPropertyValue 380 無效的屬性值
ComSetNotSupported 383 屬性只讀
ComGetNotSupported 394 屬性只讀
ComPortOpen 8000 埠打開時該存在無效
8001 超時設置必須比0值大
ComPortInvalid 8002 無效的埠號
8003 屬性只在運行時有效
8004 屬性在運行時是只讀的
ComPortAleadyOpen 8005 埠已經打開
8006 設備標識符無效或不支持
8007 不支持設備的波特率
8008 指定的位元組大小無效
8009 預設參數錯誤
8010 硬體不可用(被其他設備鎖住)
8011 函數不能分配隊列
ComNoOpen 8012 設備沒有打開
8013 設備已經打開
8014 不能使用通信通知
ComSetCommStateFailed 8015 不能設置通信狀態
8016 不能設置通信事件屏蔽
ComPortNotOpen 8018 該存在只在埠打開是有效
8019 設備忙
ComReadError 8020 通信設備讀錯誤
ComDCBError 8021 檢取埠設備控制塊時出現內部錯誤
搞清楚以上基本屬性後,就可以開始編寫通信許程序了。在VB5.0/6.0中新建一個工程文件。添加Microsoft Comm Control 5.0組
件,在簡體Form1中加入Command命令按鈕並取名為CmdTest,MSComm控制項取名為MSComm1,加入如下程序代碼。
Private Sub cmdTestClick ( ) '打開串口
MSComml.CommPort =2 '設定Com2
If MSComml.PortOpen = False Then
MSComm1.Settings = "9600,n,8,1" '9600波特率,無校驗,8位數據位,1位停止位
MSComm1.PortOpen = True '打開串口
End if
MSComm1.OutBufferCount = 0 '清空發送緩沖區
MSComm1.InBufferCount = 0 '滑空接收緩沖區
'發送字元數據時注意必須用回車符(vbcr)結束
MSComm1.Output="This is a qood book ! " &vbCr
'潑打電話號碼或發送AT命令
MSComm1.Output = "ATDT 05778191898 , & vbCr
'發送字元數組數據時注意ByteArray必須事先定義賦值
Dim ByteArray as byte( )
'定義動態數組
ReDim ByteArray(1)
'重定義數組大小
ByteArray ( 0 ) =0
ByteArray ( 1 ) = 1
MSComm1.Output = ByteArray
End Sub
private Sub MScommEvent( )
Select Case MSComm1.CommEvent
Case comEvReceive
Dim Buffer As Variant
MSComm1.InputLen = 0
'接收二進制數據
MSComm1.InputMode= ComInputModeBinary
Buffer=MSComm1.Input
'接收字元數據
MSComm1.InputMode=comInputModeText
Buffer = MSComml.Input
Case else
End Select
End sub
( 程序1)
二、中文Win 95/98下的通信問題與解決方法
1.接收的數據少於發送的數據
如果通過MSComm控制項一次性傳送較多的二進制數據,那麼,很可能收到的數據不足。例如在設置為24oobps傳輸率的情況下,
一次性可以傳輸2048個字元數據 那麼在大多數情況下。一次只能收到1200個字元左右,這址出為新版的MSComm32.OCX中存在一
個影響傳輸二進制數據的臭蟲(bug).注意這不是特性。
32位Windows API函數(以下簡稱API)使用了幾個用COMMTIMEOUTS結構表示的限時變數,WriteTotalTimeOutConstant 即是其
中的一個,它被Windows內部設定為5000(即5秒),這個常量決定了在通信驅動程序停止傳輸之前花費在發送緩沖區中數據的時間
的長短,5秒鍾意味著通信速度為1200bps情況下僅能發送600個字元,24oobps情況下僅能發送1200個左右的字元。事實上,在一個
緩沖區內一次性發送更多的數據是非常可能的。這個bug同樣也能引發問題,甚至在高速串口門通信情況下,即使系統在使用流控
制,無論叢軟體流(Xon/XofI)還是硬體流(CTS/RTS)。假如數據在發送緩沖區中時,流控制停止了傳輸,如果停止時間超過5
秒鍾.則數據就會丟失。在某些環境下,5秒鍾可能相當短.不過也不必擔心, VB 5.0/6.0版本的MSComm控制項有一個新增的重要的
屬性稱為CommID, CommID指的是當串口被打開時,被API所調用的串口句柄或稱標志,這也意味著能利用API介面函數去修改這個
常量。每次串口關閉後,Windows會自動將之恢復為5000,所以,每次打開串口後需要重斬設定以下API聲明,其代碼見下程序。
Type COMMTIMEOUTS
ReadIntervalTimeout As Long
ReadTotalTimeoutMultiplier As Long
ReadTotalTimeoutConstant As Long
WriteTotalTimeoutMultiplier As Long
WriteTotalTimeoutConstant As Long
End Type
Declare Function SetCommTimeouts Lib "Kernel32"
(BYVal hFile As Long, lpComm TimeoutsAs COMMTIMEOUTS) As Long
Declare Function GetCommTimeouts Lib "Kernel32"
(ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long
Dim timeouts As COMMEOUTS
Dim Ret As Long
If Comm1.PortOpen = False Then
Comm1.PortOpen = True
End if
Ret=GetCommTimeouts ( Comm1.CommID , timeouts )
'Set some default timeouts
timeOuts.ReadIntervalTimeout = 1
timeouts.ReadTotalTimeoutMultiplier =1
timeouts.ReadTotalTimeoutConstant =1
timeouts.WriteTotalTimeoutMultiplier =1
timeouts.WriteTotalTimeoutConstant=
( Comm1.OutBufferSize\Val(Comm1.Settings))*10000+1000
Ret=SetCommTimeouts( Comm1.CommID , timeouts )
( 程序2)
2.如何發送大於128的字元數據
在通信程序中,以單字元方式逐個發送數據時,每一個數據范圍 0-255(即十六進制的00-FF)。在單字元版本的英文Win95或
DOS版的BASIC程序中,只需要將相應的數據轉換成相應的字元發送到通信埠即可。但在中文Win95/98下卻行不通,假設在中文
Win95/98下運行以下程序:
Dim i
For i=0 to 255
MSComm1.Output=chr(i)
Next i
希望在接收端得到預期的0-255之間的數據,結果卻是:前129個數據接收正確,為0-128,後面127個數據為126個0和一個255,
造成這種給果的原因在於中文Windows使用的是雙位元組字元集(DBCS)系統。DBCS系統使用0-128之間的數字表示ASCII字元,大於
128的數字僅作為前導字元,它只是顯示是一個非拉丁語系的字元,而並不代表實際意義。上述程序在調用CHR()函數時用到了
DBCS字元集,岡此產生了此類錯誤。那麼,如何發送人於128的數據呢?答案是使用字元數組,將以上程序改為:
Dim cc(255) As Byte
For i = 0 To 255
cc(i) = i
Next i
MSComm1.Output = cc
Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0
'接收過程 MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Dim Buffer As Variant, b1,i
MSComm1.InputMode=comInputModeBinery
MSComm1.InputLen = 0
Buffer = MSComm1.Input
For i=LBound (Buffer) To UBound (Buffer )
Debug.Print Buffer ( i ) ;
Next i
Case . . . . .
3.如何發送0字元(00H,NULL)
在VisuaI C++中使用串口控制項發送0字元有些麻煩,但在VB5.0/6.0中只要注意以下兩點即可:
(1)設置MSComm控制項的屬性 NullDiscard=False;。
(2)使用二進制接收,即用 MSComm1.InputMode=ComInputModeBinary便可以解決問題;
4.如何發送遞中文字元串(DBcS字元)
VB5.0/6.0的各種參考書上均指明MSComm通信控制項不能發送或接收雙位元組字元集系統DBCS)的二進制數據,這對於我國及亞洲一些
使用DBCS字元集的國家不能不說是一大人遺憾。但是我在實踐中發現,用MSComm控制項也可以發送中文字元,具體方法有以下兩種:
(1)直接發送
直接發送即把中文字元等同於英文字元。如:MSComm1.Intput= " 這是一行中文數據!" ,但這種方法發送的中文數據不能太
長,發送緩沖區和接收緩沖區的大小需設定為中文字元的兩倍以上,而且發送與接收系統所處的操作系統版本最好要一致,否則會
出現接收或發送緩沖區溢出之類的錯誤。這種方法時用於一般要求不太高的場合。
(2)間接發送
在發送端將漢字或字元轉換為機器內碼或區位碼數據數組,然後將詠轉換後的數據發送到串口,在接收端接收到數據後,按照
相反的順序得到的數據轉換為相應的漢字或字元,在轉換過程中.要用到位運算,如取得漢字的內碼後需要將高位元組和低位元組分開,
而VB5.0/6.0中並沒有提供此類函數,以下是求整數高、低位元組的函數。
Public Function HiByte(a As Integer )
Dim b
b= a And &HFF00
b = b / 256
If b<0 Then b = b + 256
HiByte = b
End Function
Public Function LowByte(a As Integ`er)
Dim b
b = a And &HFF
LowByte = b
End Function
5.如何用單機進行通信測試
通常在寫好了通信程序後需要兩台PC或一台Pc、一台單片機.將通信口連接後進行測試,但很多時侯因條件限制僅有單台PC機,
測試項目很簡單,那麼能否測試呢?當然可以,而且方法也很簡單。對於九針的串口,找一個廢棄的串口滑鼠,剝外滑鼠線,將連
接2、3針的線對接即可;對於25針的串口,找一枚曲別針(最好有塑料外套的)將它扯直,剝削去兩頭的塑料後在兩頭各彎一個圓
圈,中間對忻後直接套接在串口的2、3針上即可。如果但心不夠安全,則可以將5針按地。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
關於mscomm的用法,提高篇......[mgwmj]?
MSCOMM控制項是個好東西,如果您能夠充分了解他,他會為您衷心的效勞。
大致看了一下下午有關討論MSCOMM的話題,覺得有必要說說我的心得,我一般只做硬體,沒有系統的學過軟體,只是業余時間
學學用用,多少掌握了一點,也在此拿出來玩玩,不知有錯沒有,我可是以為我已經做的很好了^_^
這是一個VB通用串口事件驅動接收程序。一次性接收一個數據包,數據包可以為任意位元組,保證不會丟失一個數據!
Private Sub MSComm_OnComm()
Dim S() As Byte
Dim SS(1024) As Byte
Static N As Long
Static T As Variant
If (MSComm.CommEvent = comEvReceive) Then
S = MSComm.Input '只要有數據就收進來,哪怕只是一個
If (Timer - T > 0.01) Then '間隔10MS以上就認為是一個新的包
text1="" 'text1用於搜集和顯示接收(HEX格式)
N = 0
End If
T = Timer
For i = 0 To UBound(S) '一個數據包可能產生若干個oncomm事件
Text1.Text = Text1.Text & Right("0" & Hex(S(i)) & "H", 3) + " "
SS(N+i)=S(i) '接收數據包緩存於SS()
N=N+UBound(S)
Next i
End If
End Sub
⑨ 關於Visual Studio MFC編程做一個串口通信軟體
你好!485通訊,電腦端需要加一個232到485轉換器