|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
串口通信好奇怪的一個(gè)問題,都2天拉,我也拿它沒脾氣拉 |
| 作者:happystar 欄目:單片機(jī) |
大家好啊。我用52與PC串口通信,用串口精靈調(diào)試。在程序里單步模擬執(zhí)行,程序可以運(yùn)行到程序發(fā)送數(shù)據(jù)那塊,但是硬件連接的時(shí)候PC則顯示52沒有發(fā)數(shù)據(jù),本來程序可以走到那的啊。我想請教各位。(硬件連線肯定沒問題,我用令一個(gè)程序已經(jīng)試過了),老板催的緊,這個(gè)程序調(diào)通連1/5都沒完成,小弟現(xiàn)在實(shí)在調(diào)不出來了,在此謝謝大家拉。 void initUart(void){ T2CON = 0x30;//T2 用于波特率 9600 RCAP2H = 0xff; RCAP2L = 0xdc; TR2 = 1; PCON = 0; ES = 1; } void initInt(void){//初始化中斷 IP=0x10;//串口高優(yōu)先級中斷 IE=0x9a;//中斷總允許,串口,T0,T1中斷允許 TCON=0x05;//IT1,IT0置位 TMOD=0x51;//T0采用定時(shí)器方式1;T1采用記數(shù)方式1 PCON=0x00; SCON = 0xd0;//串口工作方式3,9位UART,波特率可變 TH0 = TIMER_HIGHT;//T0產(chǎn)生1ms的延時(shí)初值 TL0 = TIMER_LOW; TR0 = 1; TH1 = 0;//T1記數(shù) TL1 = 0; TR1 = 0; initUart(); } void initProg(void){ initInt(); b232Send = 0;//232設(shè)置為接受方式 } uint crc16(uint *puchMsg, uint usDataLen){ uchar uchCRCHi=0xFF; /* 高CRC字節(jié)初始化 */ uchar uchCRCLo=0xFF; /* 低CRC 字節(jié)初始化 */ uint uIndex; /* CRC循環(huán)中的索引 */ while(usDataLen--){ /* 傳輸消息緩沖區(qū) */ uIndex=uchCRCHi^*puchMsg++; /* 計(jì)算CRC */ uchCRCHi=uchCRCLo^auchCRCHi[uIndex]; uchCRCLo=auchCRCLo[uIndex]; } crc_highByte=uchCRCHi; crc_lowByte=uchCRCLo; return(crc_highByte<<8|crc_lowByte); } void beginSend(void){//開始發(fā)送數(shù)據(jù) sendNumber=send_dataBuf[4]; b232Send=1; //設(shè)為發(fā)送 sendPosi=0; if(sendNumber>1)sendNumber--;//發(fā)一個(gè)數(shù)據(jù),所以發(fā)送字節(jié)數(shù)減1 ACC=send_dataBuf[0]; TB8=P;//偶校驗(yàn) SBUF=ACC; } void checkComm0Modbus(void){//檢查uart0數(shù)據(jù) if((recv_dataBuf[0]==head_s)&&(recv_dataBuf[1]==head_p)&& (recv_dataBuf[2]==dev_addr)){//接受完,同步頭設(shè)備地址符合且偶校驗(yàn)正確 SWITCH(recv_dataBuf[3]){//判斷功能碼 case 0x01: dev_up_handle1(); break; case 0x03:// dev_up_handle2(); break; case 0x05:// dev_up_handle3(); break; default : break; } } } void dev_up_handle1(){ uchar byteCount; recv_crcData = crc16(recv_dataBuf,5); // if(recv_crcData ==((recv_dataBuf[5]<<8)|recv_dataBuf[6])){//校驗(yàn)正確,先高位再低位校驗(yàn) SWITCH(recv_dataBuf[4]){//判斷數(shù)據(jù)地址 case 0x01:{//發(fā)全部測量數(shù)據(jù) send_dataBuf[0]=head_s; send_dataBuf[1]=head_p; send_dataBuf[2]=dev_addr; send_dataBuf[3]=recv_dataBuf[3]; send_dataBuf[4]=53;//發(fā)送字節(jié)數(shù) byteCount=send_dataBuf[4]; send_crcData=crc16(send_dataBuf,byteCount); send_dataBuf[byteCount]=send_crcData>>8; byteCount++; send_dataBuf[byteCount]=send_crcData&0x0f; beginSend(); break; } case 0x02://發(fā)部分?jǐn)?shù)據(jù)` break; default: break; // } } } void timeProc(void){//定時(shí)處理 b1ms=0; b10ms=0; ET0=0;//T0關(guān)中斷 dwTickCount=dwIntTick; ET0=1;//開中斷 if(reach_1ms){//到達(dá)1ms reach_1ms =0; b1ms=1; if(recvTimeOut>0){//判斷超時(shí)時(shí)間 recvTimeOut--; if(recvTimeOut==0&&recvNumber>0){//通訊接收超時(shí) b232Send=0; //將232置為接收狀態(tài) recvNumber=0; //將接收到的數(shù)清零 checkoutError=0; } } } if(reach_10ms){ //到達(dá)10ms reach_10ms=0; b10ms=1; } } void main(void){sendNu |
| 2樓: | >>參與討論 |
| 作者: 汽車電子 于 2006/9/27 21:02:00 發(fā)布:
Uart0.c /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ COPYRIGHT (c) $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ 肖遙電子(廣州)研發(fā)中心 $ Shawyoo ELECTRONICS (GuangZhou) R&D Center $ http://www.shawyoo.com Email: autoele@qq.com $ Q Q群:8502321/9069471/9069433/9524253 All rights reserved. $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ COPYRIGHT (c) $$$$$$$$$$$$$$$$$$$$$$$$$$$ */ /* 文件描述 文件名: UART0.c 功能描述:串口0初始化,數(shù)據(jù)鏈路層等相關(guān)程序 編譯環(huán)境:Keil C 51 目標(biāo)CPU: 8051 作者: 創(chuàng)建時(shí)間: 建議編輯環(huán)境:UltraEdit 11.00a+ 制表符寬度為三個(gè)字符,程序可讀性更好。 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */ #define UART0_GLOBALS #include "UART0.h" /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 函數(shù)名: PutString 功能: 從串口0發(fā)送一塊數(shù)據(jù)(字符串) 入口: 待發(fā)送的字符串?dāng)?shù)據(jù)指針 出口: 發(fā)送成功與否標(biāo)志,成功為0,不成功為非0 */ uchar PutString(uchar *p) { //RS485_TRANSMIT_ENABLE; if(Txd.Sending) return 1; // 發(fā)送失敗,需要等待 Txd.Length = strlen(p); if(Txd.Length==0) return 1; TxdP = p; Txd.Sending = 1; SBUF = *TxdP; return 0; } // End of <PutString> Function /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 函數(shù)名: PutBuffer 功能: 從串口0發(fā)送一塊數(shù)據(jù)(16進(jìn)制) 入口: 初始檢驗(yàn)和,數(shù)據(jù)長度,待發(fā)送的數(shù)據(jù)指針 出口: 發(fā)送成功與否標(biāo)志,成功為0,不成功為非0 */ uchar PutBuffer(uchar InitSum,uint L,uchar *p) { uint16 i; if(Txd.Sending) return 1; // 發(fā)送失敗,需要等待 Txd.Length = L; TxdP = p; Txd.CheckSum = InitSum; for(i=Txd.Length;i;i--) { Txd.CheckSum ^= *p; p++; } *p = Txd.CheckSum; // Add ChechSum at the end of the buffer Txd.Length += 1; Txd.Sending = 1; SBUF = *TxdP; return 0; } // End of <PutBuffer> Function /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 函數(shù)名: UART0_INT 功能: UART0中斷函數(shù),實(shí)現(xiàn)UART0數(shù)據(jù)鏈路層數(shù)據(jù)通訊 入口: 無 出口: 無 */ void UART0_INT(void) interrupt 4 // UART0 interrupt function { static uchar counter; uchar i,c; NOP(); NOP(); // Transmit interrupt $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ if(TI) { NOP(); NOP(); if(Txd.Length==0) { Txd.Sending = 0; //os_evt_set(UART0_TRANSMIT_OK_EVT_FLAG,tidUART0_TxdOK); // } if(Txd.Length) { //RS485_TRANSMIT_ENABLE; Txd.Length--; TxdP++; SBUF = *TxdP; Txd.Sending = 1; } else { Txd.Sending = 0; //RS485_RECEIVE_ENABLE } } // Receive interrupt $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ |
|
| 3樓: | >>參與討論 |
| 作者: 汽車電子 于 2006/9/27 21:02:00 發(fā)布:
Uart0.h #ifndef __UART0_H__ #define __UART0_H__ #include "RTOS.h" #include <string.h> #include "UserGlobals.h" // $$$$$$$$$$$$$$$$$$ <<< Use Configuration Wizard in Context Menu >>> $$$$$$$$$$$$$$$$$ // <h>請選擇是否使用UART,不使用則不占資源 /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>USE_UART: 我要使用UART? <0=> 不使用 <1=> 使用 // <i> Default: 使用 */ #define USE_UART 0 // <h>UART0初始化相關(guān)配置(CPU主頻在CPU.h文件中設(shè)置) /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>USE_TIMER: 使用定時(shí)器 <1=> 定時(shí)器1 <2=> 定時(shí)器2 // <i> Default: 定時(shí)器2 */ #define USE_TIMER 2 /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>UART0_BPS: 串口波特率設(shè)置 <1-250000> // <i> Default: 9600 */ #define UART0_BPS 19200 /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>U0_DATA_BIT: 數(shù)據(jù)位配置 <0=> 5位 <1=> 6位 <2=> 7位 <3=> 8位 // <i> Default: 3 */ #define U0_DATA_BIT 3 // <e>禁止或使能校驗(yàn)位 /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>U0_CHECK_BIT_EN: 校驗(yàn)位使能 <0=> 禁止校驗(yàn) <1=> 允許校驗(yàn) // <i> Default: 1 */ #define U0_CHECK_BIT_EN 1 /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>U0_CHECK_BIT: 校驗(yàn)位配置 <0=> 奇校驗(yàn) <1=> 偶校驗(yàn) <2=> 強(qiáng)制1 <3=> 強(qiáng)制0 // <i> Default: 0 */ #define U0_CHECK_BIT 0 // </e> /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>U0_STOP_BIT: 停止位配置 <0=> 1位 <1=> 2位 // <i> Default: 0 */ #define U0_STOP_BIT 0 /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>U0_PROIRITY: 串口中斷優(yōu)先級 <0=> 不優(yōu)先 <1=> 優(yōu)先 // <i> Default: 1 */ #define U0_PROIRITY 1 /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>UART0_REC_LENGTH: 接收緩沖區(qū)長度字節(jié)設(shè)置 <1-50> // <i> Default: 10 */ #define UART0_REC_LENGTH 20 /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // <o>UART0_TXD_LENGTH: 發(fā)送緩沖區(qū)長度字節(jié)設(shè)置 <1-50> // <i> Default: 10 */ #define UART0_TXD_LENGTH 2 // </h> // </h> // $$$$$$$$$$$$$$$$$$$ <<< end of configuration section >>> $$$$$$$$$$$$$$$$$$$$$$$$$$$$ #ifdef UART0_GLOBALS #define UART0_EXT #else #define UART0_EXT extern #endif #define OWN_ADDRESS 1 #define LEAD_OK 0x55 #define LENGTH_OK 0xaa #define FIFO_LENGTH 14 #define DATA_START_ADDR 6 /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 接收相關(guān)變量定義 */ UART0_EXT struct { uchar Buffer[UART0_REC_LENGTH]; uchar CHECKSUM,OverTime; uchar Command,Error,Receiving; uint Counter,Length; } idata Rec; /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */ UART0_EXT struct { uchar Buffer[UART0_TXD_LENGTH]; uchar CHECKSUM,Sending; uint Length; } idata Txd; UART0_EXT uchar *TxdP; uchar PutString(uchar *p); uchar PutBuffer(uchar,uint,uchar *); void Uart0_SendChar(uchar ); void ClearReceiveFlag(void); void ClearTransmitFlag(void); #endif /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ End of File $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */ |
|
| 4樓: | >>參與討論 |
| 作者: 汽車電子 于 2006/9/27 21:06:00 發(fā)布:
注意初始化程序,數(shù)據(jù)鏈層協(xié)議做好就OK了 推薦使用串口通V3.22 作串口調(diào)試 串口通V3.22,超強(qiáng)功能... 最新功能1: 接收區(qū)能混合顯示ASCII和中文,ASCII和16進(jìn)制, 最新功能2: 能自定義設(shè)置5個(gè)換行符,顯示純16進(jìn)制顯示時(shí)能自動(dòng)換行 最新功能3: 發(fā)送前可選擇自動(dòng)換行或清空接收區(qū)...增加接收時(shí)間 最新功能4: 可自定義300條常用的數(shù)據(jù)或命令,可自動(dòng)輪巡發(fā)送或手動(dòng)按次序發(fā)送選中的數(shù)據(jù) 自動(dòng)保存的路徑可選,自動(dòng)保存文件的大小可選。方便很多調(diào)試場合,更好地對事后的數(shù)據(jù)進(jìn)行分析...... 自動(dòng)保存最后配置,即打開軟件時(shí)自動(dòng)加載上次配置,方便... 自動(dòng)清空長度可選... 此外,還可選擇TB8作為多機(jī)通訊位... 特別功能: 發(fā)送/接收顯示數(shù)據(jù)支持 16進(jìn)制、10進(jìn)制和ASCII碼的混合輸入,方便更多場合調(diào)試 兩個(gè)頻率和占空比可調(diào)的低頻簡易矩形波發(fā)生器 發(fā)送數(shù)據(jù)舉例: 例1: \x01\x23 \x90 \180\238 \xf0 1234567890 \n\r \xaa ABCD可輸出中文\r\n 例2: AT+CIPSTART="TCP","168.168.168.168","1688" \r\n 例3: AT+CIPSEND=1024\r\n 輸入發(fā)送命令和長度后,可直接輸入10進(jìn)制、16進(jìn)制、ASCII和中文,到預(yù)定長度時(shí)自動(dòng)發(fā)送... 自發(fā)自收測試:115200波特率,無校驗(yàn),每隔100MS發(fā)送第一次開機(jī)默認(rèn)發(fā)送區(qū)的數(shù)據(jù)(546字節(jié))。測試過程中,界面操作反應(yīng)正常,接收顯示與發(fā)送基本同步,一直測試到發(fā)送約200KB(接收區(qū)不清空),發(fā)送字節(jié)數(shù)與接收字節(jié)數(shù)相同。 * - 本貼最后修改時(shí)間:2006-9-28 7:53:16 修改者:汽車電子 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |