導航:首頁 > 操作系統 > 單片機緩沖區溢出

單片機緩沖區溢出

發布時間:2023-08-04 18:26:09

Ⅰ 怎麼設計一個多機通信系統(單片機

簡單說明用一個主機串口實現上述要求的思路:
從機地址分別為01和02
從機的串口相同引腳相互並聯作為一個串口連接於主機串口,注意接線正確。
主機命令:地址號 + 命令字元串
從機命令:地址號 + 命令字元串
然後在各自收發代碼中利用地址號來區別命令執行
其它請參閱如下網址本人的答復:
http://..com/question/12535506.html
http://..com/question/12522809.html
http://..com/question/11725744.html
http://..com/question/11040704.html
http://..com/question/10941227.html
補充:
串列通訊的基本知識
每台計算機都提供了一個或多個串列埠。它們被依次命名為:COM1、COM2 等等。在標準的 PC 中,滑鼠通常被連接到 COM1 埠。數據機可能連接到 COM2,掃描儀被連接到 COM3,等等。串列埠提供了計算機與這些外部串列設備之間的數據傳輸通道。
串列埠的本質功能是作為 CPU 和串列設備間的編碼轉換器。當數據從 CPU 經過串列埠發送出去時,位元組數據被轉換為串列的位。在接收數據時,串列的位將被轉換為位元組數據。
我的理解:串列口數據通信的實質是ASCII(美國標准信息交換碼)的傳輸。你可理解是傳輸ASCII碼,而實際傳輸的是ASCII碼(其二進制形式,8位組成一位元組)。它又可看成是8位二進制數,例字元A 其二進製表示為 01000001,MSCOMM發送時完全按照此二進制信號發送,由低位至高位傳輸。又能理解為10進制的64。在計算機內通常以16進製表示為41。由2個8位二進制數據組成16位二進制數,通常用於數據的二進制通信。你的程序代碼採用以文本方式取回數據,這是在MSCOMM控制項內部進行解決,而無須VB編程員來處理。
見MSCOMM控制項的:
InputMode 常數
常數 值 描述
comInputModeText 0 (預設)通過 Input 屬性以文本方式取回數據。
comInputModeBinary 1 通過 Input 屬性以二進制方式檢取回數據。
以下是由MICROSOFT提供的關於串列通訊和MSCOMM控制項的一些說明,可能對你答辯有用,供參考。

串列通訊的基本知識
每台計算機都提供了一個或多個串列埠。它們被依次命名為:COM1、COM2 等等。在標準的 PC 中,滑鼠通常被連接到 COM1 埠。數據機可能連接到 COM2,掃描儀被連接到 COM3,等等。串列埠提供了計算機與這些外部串列設備之間的數據傳輸通道。
串列埠的本質功能是作為 CPU 和串列設備間的編碼轉換器。當數據從 CPU 經過串列埠發送出去時,位元組數據被轉換為串列的位。在接收數據時,串列的位將被轉換為位元組數據。
要完成數據的傳輸,還需要進一步一個解釋層。在操作系統一邊,Windows 使用了通訊驅動程序 Comm.drv,以便使用標準的 Windows API 函數發送和接收數據。驅動程序通常由串列設備製造商提供,以便將其硬體與 Windows 連接。在使用 Communications 控制項時,實際上使用了 API 函數,API 函數將被 Comm.drv 解釋並傳輸給設備驅動程序。

作為程序員,只需關心如何與 Windows 打交道。作為 Visual Basic 程序員,只需要關心 Communications 控制項提供的對 Windows 通訊驅動程序的 API 函數的介面。換句話說,只需要設置和監視 Communications 控制項的屬性和事件。

建立串列埠連接
使用 Communications 控制項的第一步是建立與串列埠的連接。下表列出了用於建立串列埠連接的屬性:

屬性 描述
CommPort 設置或返回通訊埠號。
Settings 以字元串形式設置或返回波特率、奇偶校驗、數據位和停止位。
PortOpen 設置或返回通訊埠的狀態。以及打開和關閉埠。

打開串列埠
要打開串列埠,可以使用 CommPort、PortOpen 和 Settings 屬性。例如:

'打開串列埠
MSComm1.CommPort = 2
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True

CommPort 屬性確定打開哪個串列埠。假如 COM2 上連接有一個數據機,則在上面的例子中需要將值設置為 2 (COM2) 才能連接到該數據機。CommPort 屬性值可以設置為 1 到 16 之間的任何值(預設值為 1),然而,如果將該值設置為系統中並不存在的 COM 埠,將會產生錯誤。

Settings 屬性可以用來指定波特率、奇偶校驗、數據位數和停止位數。按照預設規定,波特率被設置為 9600。奇偶校驗設置為了進行數據校驗。這通常是不用的,並設置為"N"。數據位數指定了代表一個數據塊的比特數。停止位指出了何時接收到一個完整數據塊。

在指定了要打開的埠,以及如何進行數據通訊之後,就可以使用 PortOpen 屬性建立連接了。它是一個布爾值,即取值范圍為 True 或 False。然而,如果埠無效,或者 CommPort 屬性設置有誤,或者該設備不支持指定的設置,就會產生錯誤;即使沒有產生錯誤,外部設備也不能正常工作。將 PortOpen 屬性設置為 False 即可關閉該埠。

緩沖區內存分配
InBufferSize 和 OutBufferSize 屬性指定了為接收和發送緩沖區分配的內存數量。按照預設規定,它們被分別設置為上圖所示的值。這兩個值設置得越大,應用程序中可用的內存就越少。然而,如果緩沖區太小,就要冒緩沖區溢出的風險,除非採用握手信號。

注意 鑒於現在大多數微機可用的內存量,由於有更多的可用資源,緩沖區內存分配已不那麼至關緊要了。換言之,可以把緩沖區的值設得高一些而不影響應用程序的性能。

RThreshold 和 SThreshold 屬性
RThreshold 和 SThreshold 屬性,表示在 OnComm 事件發生之前,接收緩沖區或發送緩沖區中可以接收的字元數。OnComm 事件被用來監視和響應通訊狀態的變化。如果將每個屬性的值都設置為零 (0),就可以避免發生 OnComm 事件。如果將該值設置為非零的值(比如 1),那麼每當緩沖區中接收到一個字元時,就會產生 OnComm 事件。

Output 屬性被用來向發送緩沖區發出命令和數據。
與 Input 屬性類似,數據可以以文本或二進制格式發送。Output 屬性必須用字元串變體型發送文本,用 Byte 數組變體型發送二進制數據。
可用 Output 屬性發送命令、文字字元串或 Byte 數組數據。

MSComm 控制項
MSComm 控制項通過串列埠傳輸和接收數據,為應用程序提供串列通訊功能。
語法
MSComm
說明
MSComm 控制項提供下列兩種處理通訊的方式:
事件驅動通訊是處理串列埠交互作用的一種非常有效的方法。在許多情況下,在事件發生時需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 線上一個字元到達或一個變化發生時。在這些情況下,可以利用 MSComm 控制項的 OnComm 事件捕獲並處理這些通訊事件。OnComm 事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱 CommEvent 屬性。

在程序的每個關鍵功能之後,可以通過檢查 CommEvent 屬性的值來查詢事件和錯誤。如果應用程序較小,並且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字元都產生事件,因為唯一等待接收的字元是數據機的"確定"響應。
每個使用的 MSComm 控制項對應著一個串列埠。如果應用程序需要訪問多個串列埠,必須使用多個 MSComm 控制項。可以在 Windows"控制面板"中改變埠地址和中斷地址。

盡管 MSComm 控制項有很多重要的屬性,但首先必須熟悉幾個屬性。

屬性 描述
CommPort 設置並返回通訊埠號。
Settings 以字元串的形式設置並返回波特率、奇偶校驗、數據位、停止位。
PortOpen 設置並返回通訊埠的狀態。也可以打開和關閉埠。
Input 從接收緩沖區返回和刪除字元。
Output 向傳輸緩沖區寫一個字元串。

OnComm 事件
無論何時當 CommEvent 屬性的值變化時,就產生 OnComm 事件,標志發生了一個通訊事件或一個錯誤。
語法
Private Sub object_OnComm ()
OnComm 事件語法包括下列部分:
部分 描述
object 對象表達式,其值是"應用於"列表中的對象。
說明
CommEvent 屬性包含實際錯誤或產生 OnComm 事件的數碼。注意,設置 Rthreshold 或 Sthreshold 屬性為 0,分別使捕獲 comEvReceive 和 comEvSend 事件無效。

MSComm 控制項常數
Handshake 常數
常數 值 描述
comNone 0 無握手。
comXonXoff 1 XOn/Xoff 握手。
comRTS 2 Request-to-send/clear-to-send 握手。
comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。
OnComm 常數

常數 值 描述
comEvSend 1 發送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 線變化。
comEvDSR 4 data-set ready 線變化。
comEvCD 5 carrier detect 線變化。
comEvRing 6 振鈴檢測。
comEvEOF 7 文件結束。

Error 常數

常數 值 描述
comEventBreak 1001 接收到中斷信號
comEventCTSTO 1002 Clear-to-send 超時
comEventDSRTO 1003 Data-set ready 超時
comEventFrame 1004 幀錯誤
comEventOverrun 1006 埠超速
comEventCDTO 1007 Carrier detect 超時
comEventRxOver 1008 接收緩沖區溢出
comEventRxParity 1009 Parity 錯誤
comEventTxFull 1010 傳輸緩沖區滿
comEventDCB 1011 檢索埠 設備控制塊 (DCB) 時的意外錯誤
InputMode 常數

常數 值 描述
comInputModeText 0 (預設)通過 Input 屬性以文本方式取回數據。
comInputModeBinary 1 通過 Input 屬性以二進制方式檢取回數據。

Output 屬性
往傳輸緩沖區寫數據流。該屬性在設計時無效,在運行時為只讀。
語法
object.Output [ = value ]
Output 屬性語法包括下列部分:

部分 描述
object 對象表達式,其值是"應用於"列表中的對象。
value 要寫到傳輸緩沖區中的一個字元串。

說明
Output 屬性可以傳輸文本數據或二進制數據。用 Output 屬性傳輸文本數據,必須定義一個包含一個字元串的 Variant。發送二進制數據,必須傳遞一個包含位元組數組的 Variant 到 Output 屬性。
正常情況下,如果發送一個 ANSI 字元串到應用程序,可以以文本數據的形式發送。如果發送包含嵌入控制字元、Null 字元等等的數據,要以二進制形式發送。
數據類型
Variant

Ⅱ 在stm32usb轉串口晶元CH340G中DTR#,RTS#該怎樣理解呀,各位路過的看一下,在此拜謝啦

為了簡單易理解,不再引入DCE(modem等)設備,按通常情況兩個終端設備DTE2DTE之間直接通信(比如單片機之間或單片機與PC之型扒慧間)講解,所以通信引腳採用交叉連接方式。
DTR信號是輸出信號,DTR的意思是Data
Terminal
ready
,數據終端(計算機、單片機數據的原始發送者和最終接收者)准備好。對於單片機和PC機,DTR是輸出引腳,表示本機已經上電可以工作。
一般接對端的輸入腳--DSR,RS232低電平有效,表示本設備已經上電,處於工作狀態。
DSR
的意思是Data
Set
Ready
,數據傳送者(Modem等)准備好。對於單片機和PC機來講,DSR是輸入引腳,檢測連接的設備是否上電。
RTS是終端機的輸出引腳,CTS是終端機的輸入引腳RTS與CTS是通信中為了慢終端接收數據時避免接收緩沖區溢出而採用的硬體握手信號。當RTS有效時,表示本設備有數據要發送,RTS接對端的CTS。當對端設備緩沖區數據處理完畢,會在他的RTS引腳送出有效信號發送到本機CTS,本機檢測到後,開始發卜答送數據,當對端緩沖區滿時,對端RTS引腳無效,本機檢測到後暫停數據發送,等待對端RTS有效。
本機接收數據時,RTS與CTS信號的配合大體一樣。
最後補充一點,CH340與PL2303類似,晶元輸出的RSC232信號都是反相的TTL電平,就此頌是高電平有效,便於與MAX232之類電平轉換電路連接。所以信號名稱都加上了反相標志如:~、#、^、_N
等。

Ⅲ 單片機匯編語言8隻數碼管顯示1-8

1、數碼管顯示演示程序:在8個LED數碼管上依次顯示1,2,3,4,5,6,7,8。引用埠:數碼管數據p0,數碼管控制p2;

DIS_DIGITEQU40H
;位選通值,傳送到P2口用於選通當前數碼管的數值,
;如等於0xfe時,選通P2.0口數碼管
DIS_INDEXDATA41H
;顯示索引,用於標識當前顯示的數碼管和緩沖區的偏移量
DIS_BUFDATA50H
;顯於緩沖區起始地址
ORG0000H
AJMPMAIN
ORG000BH
AJMPINTT0
ORG0100H
MAIN:MOVP0,#0FFH;初始化I/O口
MOVP2,#0FFH
MOVTMOD,#02H;定時器0在模式2下工作
MOVTL0,#38H;每200μs產生一次溢出
MOVTH0,#38H;自動重裝初值
SETBET0;使能定時器0中斷
SETBTR0;啟動定時
SETBEA;使能總中斷
MOVDPTR,#DIS_CODE;設定顯示初值為1-8
MOVA,#1;初值為1,以後順序加1
MOVCA,@A+DPTR
MOVDIS_BUF,A
MOVA,#2
MOVCA,@A+DPTR
MOVDIS_BUF+01H,A
MOVA,#3
MOVCA,@A+DPTR
MOVDIS_BUF+02H,A
MOVA,#4
MOVCA,@A+DPTR
MOVDIS_BUF+03H,A
MOVA,#5
MOVCA,@A+DPTR
MOVDIS_BUF+04H,A
MOVA,#6
MOVCA,@A+DPTR
MOVDIS_BUF+05H,A
MOVA,#7
MOVCA,@A+DPTR
MOVDIS_BUF+06H,A
MOVA,#8
MOVCA,@A+DPTR
MOVDIS_BUF+07H,A
DISPLAY:MOVDIS_DIGIT,#0FEH;初始從第一個數碼管開始掃描
MOVDIS_INDEX,#0
SETBTR0;啟動定時器0,開始動態掃描顯示
MAIN_LP:NOP
;主程序循環,可增加其它代碼以改變50H-57H中的值以改變顯示內容
SJMPMAIN_LP
;=====================================================
INTT0:
;定時器0中斷服程序,用於數碼管的動態掃描

PUSHACC
PUSHPSW
MOVP2,#0FFH;先關閉所有數碼管
MOVA,#DIS_BUF;獲得顯示緩沖區基地址
ADDA,DIS_INDEX;獲得偏移量
MOVR0,A;R0=基地址+偏移量
MOVA,@R0;獲得顯示代碼
MOVP0,A;顯示代碼傳送到P0口
MOVP2,DIS_DIGIT;
MOVA,DIS_DIGIT
;位選通值左移,下次中斷時選通下一位數碼管
RLA
MOVDIS_DIGIT,A
INCDIS_INDEX
;DIS_INDEX加1,下次中斷時顯示下一位
ANLDIS_INDEX,#0x07
;當DIS_INDEX等於8(00001000B)時,清0
POPPSW
POPACC
RETI
DIS_CODE:DB28h,7eh,0a2h,62h,74h,61h,21h,7ah
DB20h,60h,30h,25h,0a9h,26h,0a1h,0b1h
;0-9和ABCDEF的數碼管顯示代碼

END

Ⅳ 關於單片機的緩沖區/緩沖寄存器

這個怎麼跟你解釋呢?用火車站人流舉個例子吧:SBUF相當於站台,緩沖區相當於候車室。MCS—51的SBUF就一個位元組,寫入同時啟動發送。

Ⅳ 51單片機用433模塊通信時在接收到指令在很多的情況下偶爾會死機,是不是接收中斷處理程序有問題啊

re_num++;沒有上限限制,你看看你的緩沖區是不是會溢出,會不會和SP發生沖突等等,特別是SP沖突的話不死機都不可能。

閱讀全文

與單片機緩沖區溢出相關的資料

熱點內容
如何讓軟體在多個安卓系統上運行 瀏覽:569
java判斷半形 瀏覽:878
java判斷正負 瀏覽:318
刷頭條程序員的日常 瀏覽:102
吉林程序員吐槽 瀏覽:243
單片機溫度范圍 瀏覽:419
程序員為什麼素質低 瀏覽:897
可愛的程序員小姐姐 瀏覽:145
伺服器上網站的地址 瀏覽:798
蘋果平板如何找到app資源庫 瀏覽:321
阿里雲可以雲伺服器地址 瀏覽:249
熊貓繪畫app如何導入圖片 瀏覽:555
如何自己編輯手機app 瀏覽:924
程序員那麼可愛帶的項鏈 瀏覽:532
安卓系統導航mic什麼意思 瀏覽:192
編譯sdk如何輸出bin文件 瀏覽:677
如何用html5開發app 瀏覽:142
怎麼隱藏蘋果的app 瀏覽:326
上海捷豹空氣壓縮機 瀏覽:457
51單片機換行 瀏覽:738