我想用57600的波特率,但寫(xiě)入命令(0x02),隨后寫(xiě)入數(shù)據(jù)0x03,0x98,及時(shí)調(diào)整單片機(jī)波特率后去讀不到數(shù)據(jù)(死機(jī)),不知道為什么?代碼如下: mDelaymS(10); xWriteCH375Cmd(0x02);//設(shè)置通訊波特率為57600 xWriteCH375Data(0x03); xWriteCH375Data(0x98); //調(diào)整單片機(jī)波特率57600, mDelaymS(1); UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x00; UCSR1C = 0x06; UBRR1L = 0x08; //set baud rate lo UBRR1H = 0x00; //set baud rate hi UCSR1B = 0x1C; mDelaymS(1); //至少延時(shí)1ms temp=xReadCH375Data();//在此位置死機(jī) 請(qǐng)指教,謝謝
temp=xReadCH375Data();// 您在讀什麼數(shù)據(jù)啊??
CH375串行口波特率設(shè)置完成后以新設(shè)定的通訊波特率輸出操作狀態(tài),我在讀取這個(gè)狀態(tài)啊,請(qǐng)指教
不需要讀取狀態(tài)。
有返回狀態(tài),如果不讀取的話,單片機(jī)再發(fā)其他指令后,單片機(jī)的讀緩沖區(qū)會(huì)出現(xiàn)數(shù)據(jù)尚未讀取又接受新數(shù)據(jù),這樣要抱錯(cuò)的呀, CH375的資料上明明寫(xiě)著波特率重新設(shè)定后會(huì)輸出操作狀態(tài)的
是有狀態(tài)返回,這時(shí)候你讀到的狀態(tài)是什么呢?是操作成功嗎?
讀不到,我用的是串口,工作在查詢狀態(tài),單片機(jī)會(huì)死在這個(gè)死循環(huán)里面while(!(UCSR1A&(1<
那你不設(shè)置波特率的話可以操作嗎?也就是用CHECK-EXIST命令是可以通過(guò)的嗎?
我單片機(jī)用9600的波特率,CH375用默認(rèn)的9600波特率,CHECK-EXIST命令可以通過(guò)
有沒(méi)有解決啊 我也遇到這個(gè)問(wèn)題了 默認(rèn)的9600波特率,CHECK-EXIST命令可以通過(guò) 換成別的都不行
不會(huì)的,你在設(shè)置新的375的波特率之后,得重新設(shè)置單片機(jī)的波特率為相應(yīng)的新的波特率。大體如下:
在默認(rèn)9600波特率下與375通信; xWriteCH375Cmd(CMD_SET_BAUDRATE); //設(shè)置新的375波特率,設(shè)置為57600 xWriteCH375Data(0x03); //輸入分頻系數(shù) xWriteCH375Data(0x98); //輸入分頻常數(shù) TH1 = 0xFe; //重新設(shè)置單片機(jī)的波特率,22.118MHZ改為57600時(shí)取0XFE,計(jì)算:256-22118000/192/57600
375與單片機(jī)串口通信時(shí),波特率誤差不能超過(guò)2%。也就是說(shuō)計(jì)算新的單片機(jī)波特率時(shí),并不剛好是整數(shù),而帶入誤差,誤差太大的話兩者可能通信不了。 你說(shuō)換成別的不行,那你的單片機(jī)的晶振是多少的???換成什么波特率?
我用mega16 16M晶振 試過(guò)波特率1000000,19200,115200還有幾個(gè) 都接收不到數(shù)據(jù) ...調(diào)電路真折磨人 呵呵
那你計(jì)算下你的波特率的誤差是多少?
1M:0% 115200:-3.5% 19200:0.2% 這是書(shū)上的理論值
呵呵 麻煩你了,剛接觸這個(gè),有點(diǎn)亂
CH375在收到修改波特率的命令后,等數(shù)百u(mài)s再發(fā)狀態(tài)返回, 所以單片機(jī)有兩種處理方法: 1、推薦的,簡(jiǎn)單的,發(fā)出修改命令后,延時(shí)5ms以上,修改自身波特率,清除串口接收中斷標(biāo)志/清接收緩沖區(qū),忽略CH375的返回狀態(tài),然后處理下一條命令 2、精確的,發(fā)出修改命令后,確保最后一個(gè)字節(jié)發(fā)送完畢后(關(guān)鍵是,將數(shù)據(jù)送到串口發(fā)送緩沖區(qū),過(guò)一會(huì)它才能完全發(fā)出去,像16C550有發(fā)送移位寄存器空標(biāo)志),修改自身波特率(修改時(shí)可能會(huì)無(wú)意中清除接收緩沖區(qū)中的數(shù)據(jù)),立即準(zhǔn)備接收,否則就會(huì)錯(cuò)過(guò)CH375返回的狀態(tài)而一直等下去
嗷嗷感謝樓上的老大啊
第一種推薦的那個(gè)已經(jīng)都好用了(第二種的還沒(méi)調(diào)通,還在試呢)
第二種: 已經(jīng)確保發(fā)送移位寄存器空了,之后立即修改自身波特率(一條指令約 0.125us-0.25us) 問(wèn)題是之后接受標(biāo)志位一直為0,也就是說(shuō)始終無(wú)數(shù)據(jù)接受(從確保發(fā)送移位寄存器空到查看接受標(biāo)志位之間時(shí)間最大不超過(guò)1.5us) 也試過(guò)不查看接受標(biāo)志位,直接讀到的數(shù)據(jù)是 0 (懷疑是不是會(huì)有數(shù)據(jù)返回)