liuliangdt
liuliangdt
級別: 家園常客
|
小哥是個單片機業余愛好者,接觸單片機有幾年了。但很汗顏,水平一直還在入門口徘徊。本來想弄一個類似于多站通信的網絡結構程序玩。寫相互通信就的地方卡住了,再也寫不下去。現在跪求壇友幫忙,因為寫不下去已經幾個月沒碰單片機了。太恨了··· 介紹一下通訊方案。一串信息幀有5個字節組成,主站發出一串信息幀后由對于的從站響應。因為從站要快速響應所以就設計在中斷程序里回應(回復)。問題就出在這回應的子程序。同一個子程序,在主程序里順序執行的時候和其它站是正常通訊。但要快速回應還得在中斷里執行才行。從中斷程序里發出通信信息都亂了,接收方收不到正確的信息。我已經試過了我想到可能性,但都不對。希望壇友們幫忙找出錯誤。在查錯時最好要有兩塊單片機硬件聯機,然后在它們RS-485信號處連到電腦的串口助手里看那些錯誤的字節。 如有沒講請清楚的地方待補充。 |
---|---|
|
liuliangdt
liuliangdt
級別: 家園常客
|
嗯,先看看哪里有錯誤。最好在硬件上試。 |
---|---|
|
liuliangdt
liuliangdt
級別: 家園常客
|
為了吸引大家的關注,我得用英文回貼:Tie zi bu neng chen a! |
---|---|
|
supermax
級別: 工控俠客
|
給樓主一例子, //-------------------------------------------------------------- /*==================================== *名稱:lcd_str.c *功能:從串口調試工具發送一字符串到單片機,在lcd1602和串口調試工具上顯示【未加入校驗】 *作者:flying 09-2-23 *修改: ======================================*/ #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit lcden = P3^5; sbit lcdrw = P3^6; sbit lcdrs = P3^7; uchar table[10]; uchar i, j, flag; void delay(uint n) { uint x,y; for( x = n; x > 0; x--) for( y = 110; y > 0; y-- ); } //lcd寫命令函數 void lcdwrite_com( uchar com ) { lcdrs = 0; lcdrw = 0; P0 = com; delay(5); lcden = 1; delay(5); lcden = 0; } //lcd寫數據 void lcdwrite_date( uchar date ) { lcdrs = 1; lcdrw = 0; P0 = date; delay(5); lcden = 1; delay(5); lcden = 0; } //lcd初始化 void lcd_init() { lcden = 0; lcdwrite_com( 0x38 );//顯示模式設置 lcdwrite_com( 0x0e );//顯示光標 lcdwrite_com( 0x01 );//清屏 lcdwrite_com( 0x80 + 2 );//數據指針設置 } //串口初始化 void serial_init() { TMOD = 0x20; TH1 = 0xfd; //9600赫茲 TL1 = 0xfd; TR1 = 1; //開啟時間中斷 SCON = 0x50;//方式2 SM2 = 1; //可以向cpu請求中斷 EA = 1; //開總中斷 ES = 1; //開串口中斷 } void putchar( uchar ch )//發送數據 { SBUF = ch; while( !TI ); TI = 0; } void main() { lcd_init(); serial_init(); while(1) { delay(20); while( table[j] != '\0' && flag == 1 ) { j = j >= 10 ? 0 : j; putchar( table[j] ); lcdwrite_date( table[j] ); j++; // delay(10); } } } void Serial() interrupt 4 { RI = 0; if( SBUF != '#')//遇到#終止寫 { table = SBUF; i++; } else flag = 1; } |
---|---|
本帖最近評分記錄: |
liuliangdt
liuliangdt
級別: 家園常客
|
哥,我是菜鳥。能告訴我下面這幾句是什么意思嗎? /**table[j] != '\0' && flag == 1**/ /** j = j >= 10 ? 0 : j;**/ 還有/**table = SBUF;**/,“table”不是一組嗎? 我寫的那個例子在主程序掃描中是正常執行的。現在是不知道以后主程序會怎么寫、有多長,所以就想把通信那部分集中到中斷中來執行。到中斷后問題就來了,在對方接收到信息來判斷發送就有問題了。 您說的校驗部分我在百度上問過了,不過汗顏我看不懂。百度知道鏈條:http://zhidao.baidu.com/question/2137614590531493588.html?quesup2&oldq=1 |
---|---|
|
supermax
級別: 工控俠客
|
table,,是數組,而/**table = SBUF;**/已經注釋了被屏蔽了在程序里不起作用。 |
---|---|
|
supermax
級別: 工控俠客
|
那幾句意思是:如果 j >= 10,,就 j = 0, 只是把table 指向 sbuf, |
---|---|
|
supermax
級別: 工控俠客
|
再有不明白你最好請教:shi2999,,我只是他手下,他真是恐怖的高手,我的一切都他教的,我也是剛入門。 |
---|---|
|