音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

串口通信的問題 !

作者:lwsogood 欄目:單片機(jī)
串口通信的問題 !
PIC18F8490,串口通信,收只有一次正常,其他只能收到FF.為什么?
晶振11.0592,波特率9600,高速異步8位傳輸。BRG=71;串口的配置也是按照DATASHEET的。。通過WATCH,只調(diào)試收數(shù)據(jù)時(shí),上位機(jī)發(fā)下來的數(shù)據(jù)發(fā)了多次后才能進(jìn)入一次接收中斷。簡單說,就是我開串口調(diào)試助手,不停的發(fā)數(shù)據(jù),下位機(jī)只接受到一次正確的數(shù)據(jù),然后就是FF.只調(diào)試單片機(jī)發(fā)送數(shù)據(jù)時(shí),程序死在中斷里。。。移位發(fā)送寄存器一直處于滿狀態(tài),大家知道,發(fā)送的中斷標(biāo)志是由硬件清的,結(jié)果就導(dǎo)致我發(fā)的數(shù)據(jù)雖然在TXREG緩沖區(qū)里有,但因?yàn)榧拇嫫饕恢睗M,所以就一直發(fā)不出去。。。

檢查硬件,那塊電平轉(zhuǎn)換芯片正負(fù)電壓都正常,發(fā)送狀態(tài)時(shí),上位機(jī)的輸入有波形,輸出到PIC的也有。但是發(fā)送就是沒有任何波形。


本人才疏學(xué)淺,實(shí)在搞不定,希望各位大俠施展一下身手,拔刀相助!

2樓: >>參與討論
anzhongxin
全部改用查詢做實(shí)試吧!
 
3樓: >>參與討論
zgl7903
個(gè)人見解
發(fā)的數(shù)據(jù)雖然在TXREG緩沖區(qū)里有,但因?yàn)榧拇嫫饕恢睗M,所以就一直發(fā)不出去
——不是很明白LZ的意思,既然是由數(shù)據(jù)應(yīng)該是不停的發(fā),為什么是發(fā)不出去?
1 可能是硬件控制寄存器沒有設(shè)置好,詳細(xì)看看DATASHEET說明
2 波特率不對,循環(huán)發(fā)送0x55或0xAA 示波器測量脈寬是否正確?

4樓: >>參與討論
lwsogood
多謝大家,不過還是沒搞明白。。。。
回樓上的,是這樣的,PIC有兩級的存儲區(qū)。數(shù)據(jù)由軟件放到TXREG緩沖器中,然后當(dāng)收到停止符時(shí),硬件把緩沖器數(shù)據(jù)放到移位發(fā)送寄存器中。然后才是真正的發(fā)出去。

(只調(diào)試發(fā)送的過程)硬件控制寄存器的確沒設(shè)置好。改正后,我把發(fā)送和接收中斷關(guān)了。在主程序里發(fā)數(shù)據(jù)給上位機(jī)。
    if(i==8)
    {
       i=0;
    }                
    TXREG1 = buff[i];
    i++;
上位機(jī)收到幾十次數(shù)據(jù)后,就沒了。我想應(yīng)該是時(shí)序問題。。。
請教一下該在哪里延時(shí)或者怎么處理?能夠讓它每次的數(shù)據(jù)都能發(fā)送到上位機(jī)

5樓: >>參與討論
lwsogood
程序如下,拜托看看啊。。
void Ini_Uart()
{
// SET UART I/O         
        TRISC6 = 0;
        TRISC7 = 1;
// SET TXSTA         
        CSRC         = 0;        
        TX9                = 0;        // 8位數(shù)據(jù)格式
        TXEN         = 0;        // 發(fā)送允許no
        SYNC         = 0;        // 異步通信方式
        BRGH        = 0;        // 高速波特率設(shè)置
        TRMT        = 0;        
        TX9D        = 0;        

// SET RCSTA
        SPEN        = 1;        // UART允許
        RX9                = 0;        // 接收第9位清0
        SREN        = 0;        
        CREN        = 0;        // 接收允許        no
        FERR        = 0;
        OERR        = 0;
        RX9D        = 0;
        
// SET bautrate
        SPBRG         = 17;                // SET 9600bps
// SET UART INTERRUPT
        TXIE        = 0;        // UART 發(fā)送中斷允許NO
        TXIF        = 0;        // UART 發(fā)送中斷標(biāo)志位清0
        RCIE        = 0;        // UART 接收中斷允許NO
        RCIF        = 0;        // UART 接收中斷標(biāo)志位清0        
}
mian()
{
        INTCON=0x00;        
                      initial();
        Ini_Uart();
TXEN=1;        
    while(1)
    {                
                        if(TRMT==1)//如果移位發(fā)送寄存器空
                        {                                
                                if(i==8)
                                {
                                        i=0;
                                }                                
                                        TXREG1 = buff[i];
                                        i++;
                                                                                                
                        }
}
void initial()
{

        PIE1=0x00;
        PIE2=0x00;
        PIE3=0x00;


6樓: >>參與討論
lwsogood
這個(gè)程序
在在線調(diào)試模式下,可以讓上位機(jī)收到24組數(shù)據(jù),接著就再也收不到了

直接燒進(jìn)去,上電后,收到兩個(gè)字節(jié),不是我的數(shù)據(jù)。關(guān)電后,收到一串?dāng)?shù)據(jù),也不是我的真實(shí)數(shù)據(jù)。

7樓: >>參與討論
zgl7903
個(gè)人見解
關(guān)閉了串口中斷,發(fā)送數(shù)據(jù)是需要用TF標(biāo)志或者檢查緩位移寄存器標(biāo)志來判斷是否完成的,
//檢查位移寄存器
void putch(unsigned CHAR byte)
{
  while(!TRMT1)continue;        
  TXREG1 = byte;
}
//檢查中斷標(biāo)志,在初始化時(shí)需要置TX1IF為1
void putch(unsigned CHAR byte)
{
  while(!TX1IF)continue;        
  TX1IF = 0;
  TXREG1 = byte;
}

//檢查中斷標(biāo)志
void putch(unsigned CHAR byte)
{          
  TX1IF = 0;
  TXREG1 = byte;
  while(!TX1IF)continue;
}

詳細(xì)的可以參考器件的datasheet和編譯器的使用說明

另外LZ應(yīng)該養(yǎng)成一個(gè)好的習(xí)慣,包含的條件應(yīng)該比較完善
    if(i==8)
    {
       i=0;
    }                
    i++;
那么如果i的入口條件>8呢?只有到溢出至下一次達(dá)到條件,如果改為
if(i>=8)就可以更快的達(dá)到條件,同時(shí)也可以有效避免訪問超限的地址,這在寫操作中尤為重要。




8樓: >>參與討論
lwsogood
樓上的兄弟
發(fā)送中斷標(biāo)志位,DATASHEET里面說是由硬件來置為復(fù)位的啊。而且我用的是非中斷的方式。只是想用最簡單的程序做測試?墒恰。。。5555555
還是不行……………………

9樓: >>參與討論
lwsogood
好像是我復(fù)位電路有問題
檢查硬件ING^^^^^^^^^^^^^^^

10樓: >>參與討論
nuaahb
求PIC單片機(jī)12位格雷碼轉(zhuǎn)換到相應(yīng)二進(jìn)制數(shù)的原程序代碼
那位大蝦有,請告知我,qq :452853915,不勝感激!1

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
ad轉(zhuǎn)換器的選型
pic有哪款mcu帶有USB控制器?
dsPIC 多少錢一塊,那有買的?
這段程序的運(yùn)算是什么意思?
NEC高性能閃存單片機(jī)單片機(jī)
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號