----------------------------------------------------------------------------------------------------- 你好,我的板子有兩個(gè)串口是好的,但是不能發(fā)的太快,否則會(huì)有錯(cuò)碼,其他六個(gè)串口丟字節(jié)丟的很奇怪,奇字節(jié)丟或者偶字節(jié)丟數(shù),或者是丟第一個(gè)字節(jié),不知道怎么解決?FIFO已開,而且芯片發(fā)數(shù)發(fā)一會(huì)就會(huì)卡死,就發(fā)不出去了,但是可以接收數(shù)據(jù)。
你用的是什么型號(hào)的單片機(jī),單片機(jī)的晶振是多少?FIFO設(shè)置為多少個(gè)字節(jié)?你現(xiàn)在這種情況很有可能是單片機(jī)處理速度不夠造成的。
我用的是新華龍的單片機(jī)C8051F340,晶震設(shè)置的12MHZ,F(xiàn)IFO為112字節(jié),這款單片機(jī)處理速度挺快的呀,怎么會(huì)這樣?還有就是單片機(jī)收到數(shù)據(jù)后在主程序必須加55ms以上才可以把數(shù)據(jù)通過438芯片發(fā)出去,要不然就丟很多字節(jié)。
晶振設(shè)置12MHz?是外部輸入晶振頻率,還是串口的晶振設(shè)置?你現(xiàn)在接收數(shù)據(jù)沒有問題,發(fā)送有問題,那應(yīng)該是軟件的處理上有問題,你在發(fā)送數(shù)據(jù)的時(shí)候是單個(gè)字節(jié)發(fā)送還是批量發(fā)送?如果用的批量傳輸,你用單個(gè)字節(jié)試試看。
12M是單片機(jī)自帶的內(nèi)部晶振,接收數(shù)據(jù)也會(huì)偶爾丟失字節(jié),發(fā)送數(shù)據(jù)我用的是數(shù)據(jù)塊批量發(fā)送,用單個(gè)字節(jié)發(fā)送的話丟的更多。不知道何解?
438這邊寄存器初始化的時(shí)候你設(shè)置的晶振頻率和波特率是多少?是不是連續(xù)用8個(gè)串口同時(shí)發(fā)送?如果是這樣,你要在發(fā)送之后加延時(shí)來等待發(fā)送完成。
初始化時(shí)的晶振頻率都是1.8432Mhz,波特率是用撥碼開關(guān)設(shè)置的,可選擇57600或者115200的。8個(gè)串口是接收到數(shù)據(jù)后同時(shí)發(fā)送的,容易丟數(shù),我在接收到單片機(jī)串口數(shù)據(jù)后,有標(biāo)志位時(shí)才開始發(fā)的數(shù),在第一個(gè)串口發(fā)數(shù)之前加了55MS的延時(shí),否則丟數(shù)非常厲害。之前在發(fā)送后加了個(gè)小延時(shí),沒什么改觀。以為是單片機(jī)晶振太小,現(xiàn)在也換成外部晶振22,1184Mhz了,也沒什么改觀。
你現(xiàn)在用的是我們的開發(fā)板還是自己焊接的板子?用的是直接地址方式還是復(fù)用地址方式?如果是復(fù)用地址方式,那我們的例程是不能跟你的單片機(jī)很好的配合的,因?yàn)槔淌轻槍?duì)普通的51,你現(xiàn)在的單片機(jī)指令周期要比普通的51快幾倍,所以如果你是這樣用的話,建議參照我們手冊(cè)的時(shí)序圖在發(fā)送和接收的時(shí)候加些延時(shí)。
我用的是自己設(shè)計(jì)的板子,外加工的,復(fù)用地址方式,應(yīng)該不是時(shí)序圖沒處理好的問題,現(xiàn)在芯片每個(gè)串口初始化有個(gè)問題:有這句:WriteCH438Data( REG_FCR7_ADDR, BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN ); 沒有這句:WriteCH438Data( REG_IIR7_ADDR, BIT_IIR_FIFOENS1 | BIT_IIR_FIFOENS0 ); 的時(shí)候各個(gè)串口發(fā)送沒有問題,接收數(shù)據(jù)有兩個(gè)串口沒問題,其他幾個(gè)串口都在丟字節(jié),有些是丟奇字節(jié),有些丟偶字節(jié),有些沒有規(guī)律的丟字節(jié)。要是這兩句在初始化的時(shí)候都有,那各個(gè)串口接收卻都沒問題了,但每個(gè)串口發(fā)送就固定丟偶字節(jié)的數(shù)據(jù)。
FCR是只寫寄存器,第一句是設(shè)置FIFO觸發(fā)級(jí)并開FIFO,你現(xiàn)在設(shè)置的是112字節(jié),第二句就有問題了,IIR是只讀寄存器,用于查詢具體的中斷狀態(tài),你不能這樣操作,開FIFO功能,前一句就可以了,后面一句是錯(cuò)的;前面用撥碼開關(guān)來設(shè)置波特率,有沒有重新配置DLL和DLM這兩個(gè)寄存器?你接收到數(shù)據(jù),是把數(shù)據(jù)打印出來?我們網(wǎng)站上有51例程,你可以參考下。你可以用9600的波特率來試試,是不是數(shù)據(jù)量太大、太快造成的,畢竟你現(xiàn)在是8個(gè)串口同時(shí)收發(fā)。