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