pb串口通信時,讀取串口資料命令parent.ole_1.object.Input總是提示錯誤,無法取得串口資料,不知什么原因,請高手指點
具體程序
1、設定串口相關引數
ole_1.object._CommPort = 8
ole_1.object.Settings = "9600,n,8,1"
ole_1.object.InputLen = 0
ole_1.object.InBufferSize = 90
ole_1.object.OutBufferSize = 60
ole_1.object.SThreshold = 0
ole_1.object.RThreshold = 9
ole_1.object.Handshaking = 0
ole_1.object.PortOpen = True
ole_1.object.InBufferCount = 0
ole_1.object.DTREnable = true
2、打開串口
Ole_1.object.PortOpen = True //打開串口
//清空接識訓沖
parent.ole_1.object.inbuffercount=0
//清空發送緩沖
parent.ole_1.object.outbuffercount=0
3、發送串口資料及讀取串口資料
string ls_data='',ls_data1=''
//發送attention命令
parent.ole_1.object.Output = "R" + char(13)
//等待資料。
Do
Yield()
//從Com埠取資料
loop while ole_1.object.inbuffercount<1
ls_data1=parent.ole_1.object.Input
ls_data=https://bbs.csdn.net/topics/ls_data + ls_data1
LOOP Until (Pos(ls_data, "OK" + char(13) + char (10)) > 0)
//向Com埠發送資料使用Output方法
parent.ole_1.Object.Output = ls_data
parent.mle_1.text= ls_data
//關閉埠。
parent.ole_1.object.PortOpen = FALSE
問題:程式運行到 ls_data1=parent.ole_1.object.Input 就提示錯誤,請高手指點
uj5u.com熱心網友回復:
急急急,十萬火急uj5u.com熱心網友回復:
你用的是什么控制元件,是微軟體的mscomm嗎?Pb中的串行通信(MSCOMM32.OCX)完全解答版
本文給出一個在PB6中如何采集串行口資料的實體
一:問題描述
本文解決的是采集磅房的磅值讀取問題。磅秤和計算機(COM1/COM2)之間使用RS-232標準串行線相連。波特率為1200,資料格式如下:每100ms發送一組資料,每組資料有5幀,每幀11位,1位起始位(0),8位資料位(D0-D7),2位停止位(1),無奇偶校驗.定義如下:
第1幀:D0—D7 ----0FFH(起始位)
第2幀:D0—D2 ----為小數點位置(0-5)
D3 -----NC
D4 -----1表示稱重穩定 0表示稱重未穩定
D5 -----1表示稱重為負 0表示稱重為正
D6 -----NC
D7 -----1表示超載
第3幀:D0—D7 ----BCD1(稱重值)
第4幀:D0—D7 ----BCD2(稱重值)
第5幀:D0—D7 ----BCD3(稱重值)
BCD1,BCD2,BCD3為由低到高的稱重值的BCD碼。
二:解決方案
使用VB中的MSCOMM32.OCX控制元件,先在PB中的OLE的insert control中注冊該控制元件,如果注冊完畢后使用時提示沒有license ,則是沒有注冊碼問題,網上提供了好多這方面的解決方法,但試過后都沒能解決問題,我的解決方法是裝VB,安裝VB時一定要選擇安裝activeX。轉完vb肯定能解決問題。
在視窗上添加該控制元件,名稱為ole_1。在視窗的open事件里設定ole_1的屬性。
ole_1.object.commport=1
ole_1.object.settings="1200,n,8,1"
ole_1.object.portopen=true
ole_1.object.rthreshold= 10 //每次取10個位元組,在10個位元組中肯 定包含一個完整//(5個位元組)的磅值資料
ole_1.object.inputlen=1
ole_1.object.inputmode=0
各屬性的意義在下面有詳細的解釋。
在ole_1控制元件的oncomm事件里添加如下代碼
choose case ole_1.object.commevent
case 2
ole_1.object.Rthreshold=0
string ls_t
int ii
int w1,w2,w3,flag1,flag2
for ii=1 to 10
ls_t = ole_1.object.input
flag1 = asc(ls_t) //取位元組的數值
if flag1 = 255 then //判斷是否為起始位
ls_t = ole_1.object.input
flag2 = asc(ls_t)
if flag2 = 8 then //判斷數值是否正確
//讀取BCD1, BCD2,BCD3的值
w1 = asc(ole_1.object.input)
w2 = asc(ole_1.object.input)
w3 = asc(ole_1.object.input)
end if
end if
next
//將BCD碼轉換為十進制數值
w1 = w1 - 6*int(w1/16)
w2 = w2 - 6*int(w2/16)
w3 = w3 - 6*int(w3/16)
//按高低位計算
st_1.text=string(w1 + w2*100+w3*10000)
//在次讀取10個數值,觸發oncomm事件
ole_1.object.Rthreshold=10
case 1006
st_1.text="over run"
case 8020
st_2.text="read comm device error"
case 1001
st_1.text="break signal received"
case else
st_1.text=string(ole_1.object.input)
return
end choose
三 MSCOMM32控制元件的基本屬性
MSComm控制元件通過串行埠傳輸和接收資料,為應用程式提供串行通訊功能。MSComm控制元件在串口編程時非常方便,程式員不必去花時間去了解較為復雜的API函式,而且在VC、VB、Delphi等語言中均可使用。 MicrosoftCommunicationsControl(以下簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控制元件,它為應用程式提供了通過串行介面收發資料的簡便方法。具體的來說,它提供了兩種處理通信問題的方法:一是事件驅動(Event-driven)方法,一是查詢法。
1.MSComm控制元件兩種處理通訊的方式
MSComm控制元件提供下列兩種處理通訊的方式:事件驅動方式和查詢方式。
1.1事件驅動方式
事件驅動通訊是處理串行埠互動作用的一種非常有效的方法。在許多情況下,在事件發生時需要得到通知,例如,在串口接識訓沖區中有字符,或者CarrierDetect(CD)或RequestToSend(RTS)線上一個字符到達或一個變化發生時。在這些情況下,可以利用MSComm控制元件的OnComm事件捕獲并處理這些通訊事件。OnComm事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的串列,參閱CommEvent屬性。在編程程序中,就可以在OnComm事件處理函式中加入自己的處理代碼。這種方法的優點是程式回應及時,可靠性高。每個MSComm控制元件對應著一個串行埠。如果應用程式需要訪問多個串行埠,必須使用多個MSComm控制元件。
1.2查詢方式
查詢方式實質上還是事件驅動,但在有些情況下,這種方式顯得更為便捷。在程式的每個關鍵功能之后,可以通過檢查CommEvent屬性的值來查詢事件和錯誤。如果應用程式較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程式,則沒有必要對每接收一個字符都產生事件,因為唯一等待接收的字符是調制解調器的“確定”回應。
2.MSComm控制元件的常用屬性
MSComm控制元件有很多重要的屬性,但首先必須熟悉幾個屬性。
CommPort設定并回傳通訊埠號。
Settings以字串的形式設定并回傳波特率、奇偶校驗、資料位、停止位。
PortOpen設定并回傳通訊埠的狀態。也可以打開和關閉埠。
Input從接識訓沖區回傳和洗掉字符。
Output向傳輸緩沖區寫一個字串。
下面分別描述:
CommPort屬性設定并回傳通訊埠號。
語法object.CommPort[value](value一整型值,說明埠號。)
說明在設計時,value可以設定成從1到16的任何數(預設值為1)。但是如果用PortOpen屬性打開一個并不存在的埠時,MSComm控制元件會產生錯誤68(設備無效)。
注意:必須在打開埠之前設定CommPort屬性。
RThreshold屬性:在MSComm控制元件設定CommEvent屬性為comEvReceive并產生OnComm之前,設定并回傳的要接收的字符數。
語法object.Rthreshold[=value](value整型運算式,說明在產生OnComm事件之前要接收的字符數。)
說明當接收字符后,若Rthreshold屬性設定為0(預設值)則不產生OnComm事件。例如,設定Rthreshold為1,接識訓沖區收到每一個字符都會使MSComm控制元件產生OnComm事件。
CTSHolding屬性:確定是否可通過查詢ClearToSend(CTS)線的狀態發送資料。ClearToSend是調制解調器發送到相聯計算機的信號,指示傳輸可以進行。該屬性在設計時無效,在運行時為只讀。
語法:object.CTSHolding(Boolean)
Mscomm控制元件的CTSHolding屬性設定值:
TrueClearToSend線為高電平。
FalseClearToSend線為低電平。
說明:如果ClearToSend線為低電平(CTSHolding=False)并且超時時,MSComm控制元件設定CommEvent屬性為comEventCTSTO(ClearToSendTimeout)并產生OnComm事件。
ClearToSend線用于RTS/CTS(RequestToSend/ClearToSend)硬體握手。如果需要確定ClearToSend線的狀態,CTSHolding屬性給出一種手工查詢的方法。
詳細資訊有關握手協議,請參閱Handshaking屬性。
SThreshold屬性:MSComm控制元件設定CommEvent屬性為comEvSend并產生OnComm事件之前,設定并回傳傳輸緩沖區中允許的最小字符數。
語法object.SThreshold[=value]
value整形運算式,代表在OnComm事件產生之前在傳輸緩沖區中的最小字符數。
說明:若設定Sthreshold屬性為0(預設值),資料傳輸事件不會產生OnComm事件。若設定Sthreshold屬性為1,當傳輸緩沖區完全空時,MSComm控制元件產生OnComm事件。如果在傳輸緩沖區中的字符數小于value,CommEvent屬性設定為comEvSend,并產生OnComm事件。comEvSend事件僅當字符數與Sthreshold交叉時被激活一次。例如,如果Sthreshold等于5,僅當在輸出佇列中字符數從5降到4時,comEvSend才發生。如果在輸出佇列中從沒有比Sthreshold多的字符,comEvSend事件將絕不會發生。
Handshake常數
常數值描述
comNone0無握手。
comXonXoff1XOn/Xoff握手。
comRTS2Request-to-send/clear-to-send握手。
comRTSXOnXOff3Request-to-send和clear-to-send握手皆可。
OnComm常數
常數值描述
comEvSend1發送事件。
comEvReceive2接收事件。
comEvCTS3clear-to-send線變化。
comEvDSR4data-setready線變化。
comEvCD5carrierdetect線變化。
comEvRing6振鈴檢測。
comEvEOF7檔案結束。
Error常數
常數值描述
comEventBreak1001接收到中斷信號
comEventCTSTO1002Clear-to-send超時
comEventDSRTO1003Data-setready超時
comEventFrame1004幀錯誤
comEventOverrun1006埠超速
comEventCDTO1007Carrierdetect超時
comEventRxOver1008接識訓沖區溢位
comEventRxParity1009Parity錯誤
comEventTxFull1010傳輸緩沖區滿
comEventDCB1011檢索埠設備控制塊(DCB)時的意外錯誤
InputMode常數
常數值描述
comInputModeText0(預設)通過Input屬性以文本方式取回資料。
comInputModeBinary1通過Input屬性以二進制方式檢取回資料。
CDHolding屬性:通過查詢CarrierDetect(CD)線的狀態確定當前是否有傳輸。CarrierDetect是從調制解調器發送到相聯計算機的一個信號,指示調制解調器正在聯機。該屬性在設計時無效,在運行時為只讀。
語法object.CDHolding
設定值:CDHolding屬性的設定值為:
設定描述
TrueCarrierDetect線為高電平
FalseCarrierDetect線為低電平
說明:注意當CarrierDetect線為高電平(CDHolding=True)且超時時,MSComm控制元件設定CommEvent屬性為comEventCDTO(CarrierDetect超時錯誤),并產生OnComm事件。
注意在主機應用程式中捕獲一個丟失的傳輸是特別重要的,例如一個公告板,因為呼叫者可以隨時掛起(放棄傳輸)。
CarrierDetect也被稱為ReceiveLineSignalDetect(RLSD)。
資料型別Boolean
DSRHolding屬性:確定DataSetReady(DSR)線的狀態。DataSetReady信號由調制解調器發送到相連計算機,指示作好操作準備。該屬性在設計時無效,在運行時為只讀。
語法:object.DSRHolding
object所在處表示物件運算式,其值是“應用于”串列中的物件。
DSRHolding屬性回傳以下值:
值描述
TrueDataSetReady線高
FalseDataSetReady線低
說明:當DataSetReady線為高電平(DSRHolding=True)且超時時,MSComm控制元件設定CommEvent屬性為comEventDSRTO(資料準備超時)并產生OnComm事件。
當為DataTerminalEquipment(DTE)機器寫DataSetReady/DataTerminalReady握手例程時該屬性是十分有用的。
資料型別:Boolean
Settings屬性:設定并回傳波特率、奇偶校驗、資料位、停止位引數。
語法:object.Settings[=value]
說明:當埠打開時,如果value非法,則MSComm控制元件產生錯誤380(非法屬性值)。
Value由四個設定值組成,有如下的格式:
"BBBB,P,D,S"
BBBB為波特率,P為奇偶校驗,D為資料位數,S為停止位數。value的預設值是:
"9600,N,8,1"
InputLen屬性:設定并回傳Input屬性從接識訓沖區讀取的字符數。
語法object.InputLen[=value]
InputLen屬性語法包括下列部分:
value整型運算式,說明Input屬性從接識訓沖區中讀取的字符數。
說明:InputLen屬性的預設值是0。設定InputLen為0時,使用Input將使MSComm控制元件讀取接識訓沖區中全部的內容。
若接識訓沖區中InputLen字符無效,Input屬性回傳一個零長度字串("")。在使用Input前,用戶可以選擇檢查InBufferCount屬性來確定緩沖區中是否已有需要數目的字符。該屬性在從輸出格式為定長資料的機器讀取資料時非常有用。
EOFEnable屬性:確定在輸入程序中MSComm控制元件是否尋找檔案結尾(EOF)字符。如果找到EOF字符,將停止輸入并激活OnComm事件,此時CommEvent屬性設定為comEvEOF,
語法:object.EOFEnable[=value]
EOFEnable屬性語法包括下列部分:
value布爾運算式,確定當找到EOF字符時,OnComm事件是否被激活,如“設定值”中所描述。
value的設定值:
True當EOF字符找到時OnComm事件被激活。
False(預設)當EOF字符找到時OnComm事件不被激活。
說明:當EOFEnable屬性設定為False,OnComm控制元件將不在輸入流中尋找EOF字符。
錯誤訊息(MSComm控制元件)
下表列出MSComm控制元件可以捕獲的錯誤:
值描述
380無效屬性值comInvalidPropertyValue
383屬性為只讀comSetNotSupported
394屬性為只讀comGetNotSupported
8000埠打開時操作不合法comPortOpen
8001超時值必須大于0
8002無效埠號comPortInvalid
8003屬性只在運行時有效
8004屬性在運行時為只讀
8005埠已經打開comPortAlreadyOpen
8006設備識別符號無效或不支持該識別符號
8007不支持設備的波特率
8008指定的位元組大小無效
8009預設引數錯誤
8010硬體不可用(被其它設備鎖定)
8011函式不能分配佇列
8012設備沒有打開comNoOpen
8013設備已經打開
8014不能使用comm通知
8015不能設定comm狀態comSetCommStateFailed
8016不能設定comm事件屏蔽
8018僅當埠打開時操作才有效comPortNotOpen
8019設備忙
uj5u.com熱心網友回復:
可以參考以下鏈接http://blog.sina.com.cn/s/blog_6e0ce6ff0100vvmz.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/36549.html
標籤:控件與界面
