① pic單片機與電腦串口通信不正常:工作一段時間後電腦vb串口程序無法接收到數據,但單片機一直正常工作。
1. 是否使用了USB轉串口?如果使用了的話,換一台有串口的台式機試試看,如果好了的話,可能是轉接線有問題;
2. 不打開VB應用程序,只使用串口助手接收數據,如果有通信協議的話,挑一條可以固定應答的報文循環發送接收,看發送/接收位元組數的比率,正常的話會是一個定值,沒問題的話,證明下位機應用層到上位機鏈路層是沒有問題的;
3. 現在只剩下VB軟體了,VB我不會,但是我用VC寫過類似的東西,我認為可能是你的軟體接收不及時導致了串口接收緩沖區滿或者報文接收出現偏差,最好設計一個完備的通信協議,每次通信都要有可靠的緩沖處理、校驗處理、應答處理和錯誤重試處理,一次應答結束後及時清除接收緩沖,這樣能保證可靠、持續的通信。
我只提供解決問題的思路,不替代你解決問題,希望能有所幫助,呵呵。
② 求pic18單片機串口接收多位元組代碼
#include <p18cxxx.h>
#pragmaconfigOSC=HS,OSCS=OFF
#pragmaconfigPWRT=OFF,BOR=OFF
#pragmaconfigWDT=OFF
#pragmaconfigDEBUG=ON
#pragmaconfigLVP=OFF
volatile unsigned charreceiver_buffer;
void usart_isr(void);
#pragma code low_vector=0x18
void low_interrupt (void)
{_asm
goto usart_isr
_endasm
}
#pragma code
#pragma interruptlow usart_isr
void usart_isr (void)
{receiver_buffer=RCREG;} //中斷入口就是要求放一個GOTO 跳轉指令,中斷服務函數用關鍵詞定義,
void main(void)
{while(1){
//IO 初始化
//RB0,RB1,RB2,RB3->output
//RC6,RC7 ->input
PORTB=0x00;
TRISB=0x00;
TRISC=0xc0;
//波特率初始化9600
//Fosc=4MHZ
//BRGH=1
SPBRG=25;
//串口工作方式使能
TXSTAbits.SYNC=0;
TXSTAbits.BRGH=1;
TXSTAbits.TX9=0;
RCSTAbits.SPEN=1;
RCSTAbits.RX9=0;
//中斷使能
INTCONbits.GIE=1;
INTCONbits.PEIE=1;
PIE1bits.RCIE=1;
PIE1bits.TXIE=0;
//接收使能
RCSTAbits.CREN=1;
while(1){
//判斷接收位元組是否為0x55
//是,點LED
//否,繼續等待
if(receiver_buffer==0x55){
PORTBbits.RB0=1;
//發送使能
TXSTAbits.TXEN=1;
TXREG=0x55;
}
else
PORTBbits.RB0=0;
}
}
}
③ pic16f877a系列單片機串口接收中斷屏蔽後,若外部有串口數據不斷的發入,單片機會溢出出錯嗎!
各種通訊界面, 都會有溢出出錯問題. 硬體設計上, 會提供Register狀態判斷, 以及錯誤處理控制bit, 如內部串口模塊的reset. 實際如何處置, 需要詳閱datasheet.
溢出出錯是否要處理, 依據需求而定, 如果你根本不需要串口(屏蔽), 不去處理溢出出錯也沒關系. 如果還需要使用串口, 應該要注意如何將單片機的串口模塊, 從恢復錯誤狀態中恢復.
在基本的設計邏輯上, 會建議系統的規劃, 應避免去屏蔽任何一個你需要的中斷源. 當然, 如果你很清楚自己在做什麼, 有特殊考量, 也不是不可以的.
ps. 部分單片機的內部模塊, 具備各自獨立的電源控制, 如不需要, 也可以考慮關閉其電源. 在電池系統中, 這部分會比較注意. (模塊沒有電源, 有沒有持續輸入就無差別, 啟動時同reset)
④ pic18F單片機串口USART接收的問題
在允許串口中斷的情況下,當緩沖器接收完一個完整的位元組,而且ri=0,則會將緩沖器內的數值保存到sbuf寄存器中,並且ri置1,產生中斷請求。如果緩沖器沒有接收完一個完整的位元組(沒有收到停止位),或者接收完一個完整的位元組時ri=1,則不產生中斷,不將緩沖器內的值保存到sbuf,接收到的數據幀丟失,不再恢復。
⑤ PIC單片機串口接收進不了中斷,發送正常
接收中斷要在中斷函數內用RCIF查詢
⑥ 求助關於PIC單片機串口中斷的接受和發送問題
你在主函數中先把RCIF標志位清零,你做的應該是SCI串列通信吧,一上電,就表示程序開始執行了,你程序一開始執行就是要進行SCI串列通信,當然一開始就進入中斷了,如果你不想這樣,你可以連一個按鈕,當此按鈕按下後就進入中斷執行SCI通信
⑦ pic單片機用串口發送接收數據
當接收到數據時,RCIF會被置1,如果讀了接收結果RCREG,則系統自動會把RCIF清0。
程序把清RCIF語句屏蔽了,但TXREG=RCREG;這一句就是讀接收結果(把接收結果RCREG送到發送寄存器TXREG里),所以會自動讓RCIF清0,只有新數據來時,RCIF才會置1,才能再進入中斷。
如果把發送的語句改為TXREG=0X12(或其他不是RCREG的寄存器的變數),因此中斷後沒有讀取接收數據,也就不能清RCIF,RCIF仍然為1,即中斷服務程序退出後,還存在的中斷請求,因此就會馬上進入中斷,從而出現不停的發送數據的現象。
解決的辦法有2:
1、讓原來屏蔽的語句RCIF=0有效;
2、空讀RCREG,如定義一個變數A(unsigned char A),在發送數據後或前,增加A=RCREG就可以了。
⑧ PIC單片機與電腦串口通信
//串口初始化
void usart_init()
{
TRISC = 0xFF; //設置C口方向全為輸入
RCSTA = 0x90; //使能串口工作,連續接收
TXSTA = 0x24; //設定TXSTA寄存器。
SPBRG = 0x19; //4MHZ, BRGH=1, 9600BPS
INTCON = 0xC0; //開放全局中斷,使能外部中斷
RCIE = 0x1; //使能USART接收中斷
}
這樣配置 還有就是中斷配置了 這個我認為你的接受與發送的數據一樣說明你的中斷在你加一處理以前動作了 明白嗎?在仔細看一下,尤其是PIC的中斷系統結構!
⑨ PIC單片機問題 串口傳輸數據,感覺一直在中斷程序裡面門都進不了主循環。
unsigned char rev_data = 0;
unsigned char send_data = 0;
void interrupt ISR()
{
if (RCIE & RCIF) //判斷是否為串口接收中斷
{
rev_data = RCREG; //將接收緩存器中數據讀取出來
if(TRMT == 1)
{
TXREG = rev_data;
}
PORTD = ~PORTD;
}
}
單片機最好不要直接寄存器的值賦給寄存器,對串口接收中斷必須將緩存器數據讀取出來才能清空。另外main函數中while(1)當中要作長延時,不然數據看不到你從串口助手發送後,單片機返回的數據,你嘗試一下,不能保證一定可以。
⑩ 關於PIC單片機串口通訊問題
嗯 如樓上 有條件的話 直接用示波器來看(研發的話 應該是有的)
不過感覺看來 應該是波特率的問題 單片機那邊設置波特率都是用定時器來的
到底設置的誤差有多大 串口數據一般是LSB低位先出 一端用A'來發數據 而另一端讀串口數據的時候用波特率A對應的頻率來掃描串口端得數據 從你的「 如發0x9F他收到得就變成0X1F 」 畫出波形分析 前5個bit不出錯 累積到第6個bit 出問題 可以算出 你發的波特率 和接受的波特率的關系 也就可以理解為什麼是高位出問題
也就是說 碼元周期(波特率倒數)是相差一些的 因為我不知道 你說的「 如發0x9F他收到得就變成0X1F 」 裡面哪個數據是按確定的標准來處理的
但是提示這些的話 你自己應該可以察覺一些東西出來了 反過去算
還有你說的換有牌子的轉換器會正常 我想應該只是好一點吧 因為牌子的轉換器可能是對電平跳變處理的好一些 就是那些上升沿 下降沿 比較陡 這樣的話對有誤差的非同步串列數據的識別是有好處的 但是誤差還是在那裡 沒有從根本上解決
http://hi..com/xiasanming/blog/item/b09a59dffc8a074e94ee3788.html
這是我自己寫一點關於UART串列數據的 希望對有用