奇偶校驗(yàn)?zāi)銜脝幔?/h1>
在工作中調(diào)試通訊時(shí),發(fā)現(xiàn)有諸多的干擾數(shù)據(jù)出現(xiàn),想想串口通訊除去外部硬件電路去除干擾外,還可以通過軟件來濾掉干擾數(shù)據(jù),于是我就想到了串口通訊中的奇偶校驗(yàn)。印象中,在編寫STM32F030程序初始化串口時(shí),對其配置的時(shí)候有一個(gè)屬性是否使用奇偶檢驗(yàn)。我想,只需要簡單修改一下這一個(gè)屬性,程序便大功告成了??墒墙Y(jié)果真的是我所預(yù)料的嗎?請看下文。
本文引用地址:http://www.ex-cimer.com/article/280413.htm
我們先來看一下STM32F030的串口初始化程序,程序清單如下:
USART_InitStructure.USART_BaudRate = 115200; 波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;數(shù)據(jù)位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1;停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No;奇偶校驗(yàn)位無
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;無硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;使能發(fā)送與接收功能
USART_Init(USART1, &USART_InitStructure);初始化串口1
上面這段程序沒有特別之處,廣泛示例于各大論壇,教程,而筆者也只是將上面奇偶校驗(yàn)位這一行,修改為了USART_InitStructure.USART_Parity = USART_Parity_Odd;即奇校驗(yàn)。然后,重新編譯,下載,一切正常??墒?hellip;…
從圖1可以清楚看到,在未修改之前,串口能正常接收到字符串,但是在修改之后,取而待之的都是亂碼。無論P(yáng)C機(jī)軟件配置為奇校驗(yàn),偶檢驗(yàn),還是無奇偶校驗(yàn)均無正確顯示。頓時(shí),整個(gè)人的感覺就不好了。555……
筆者也是借此機(jī)會深入了解了一下奇偶校驗(yàn),與STM32F030芯片上的實(shí)現(xiàn)?,F(xiàn)在將奇偶校驗(yàn)認(rèn)識的三大誤區(qū)及應(yīng)用實(shí)現(xiàn)分享給大家。
誤區(qū)一:修改一下串口配置參數(shù)就可以了嗎?
這個(gè)誤區(qū)我覺得應(yīng)該放在第一位,主要因?yàn)楣P者首先就這樣認(rèn)為的。通過上面的實(shí)例,也已經(jīng)充分說明僅修改一個(gè)屬性是無法實(shí)現(xiàn)的。通過仔細(xì)閱讀編程手冊,發(fā)現(xiàn)在配置奇偶校驗(yàn)屬性后,必須要修改數(shù)據(jù)位為9位,否則PC端無法接收。以下是筆者查詢到的資料(STM32F10xxx參考手冊):
通過上面的截圖(圖2),我們可以看到,如果將串口配置為了奇校驗(yàn),且數(shù)據(jù)位為8位,那么數(shù)據(jù)位的位7將被替換為奇檢驗(yàn)位——也就是說,原有的數(shù)據(jù)被破壞了。這也就證明了圖1為什么會出現(xiàn)亂碼的現(xiàn)象了。
既然發(fā)現(xiàn)了錯(cuò)誤,那就要解決。通過查詢相關(guān)文檔,與詳細(xì)閱讀STM32芯片編程手冊,最后通過以下配置即可實(shí)現(xiàn)正常發(fā)送,與奇偶校驗(yàn)。程序配置清單如下:
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Odd;
如果將數(shù)據(jù)位數(shù)擴(kuò)展成9位,那么奇偶校驗(yàn)位將占用新插入的位8,也就不必破壞原數(shù)據(jù)。通過編譯與下載程序,并在PC機(jī)上驗(yàn)證,此方法確實(shí)可行,PC機(jī)數(shù)據(jù)正常接收,再次重現(xiàn)”Hello EEPW”。
誤區(qū)二:PC機(jī)串口軟件無法實(shí)現(xiàn)奇偶校驗(yàn)發(fā)送?
筆者在查閱資料的時(shí)候發(fā)現(xiàn)有好多網(wǎng)友都有這樣的觀念,但是筆者的PC機(jī)軟件的確是可以發(fā)送奇偶檢驗(yàn)的。通過多次實(shí)驗(yàn)筆者發(fā)現(xiàn),SScomm串口工具軟件v3.2版本無法實(shí)現(xiàn),但SScomm版本v4.2可以實(shí)現(xiàn)。
雖然說是實(shí)現(xiàn)奇偶校驗(yàn),但是僅限發(fā)送時(shí)會發(fā)送嚴(yán)格按照配置要求發(fā)送,即會發(fā)送奇偶校驗(yàn)位,從而下位機(jī)將正常接收。但是接收的時(shí)候,并不表示奇偶校驗(yàn)位錯(cuò)誤,上位機(jī)不會接收數(shù)據(jù)——上位機(jī)的具體實(shí)現(xiàn)也是這樣的。上位機(jī)不管奇偶校驗(yàn)是否正確,仍然會正常顯示接收的數(shù)據(jù),這個(gè)并不影響我們實(shí)際應(yīng)用,也只是說明一下而已。
誤區(qū)三:STM32F030配置了奇偶校驗(yàn)位,就不會接收到錯(cuò)誤的字節(jié)了
很遺憾,這個(gè)也是非常大的誤區(qū)。通過在線仿真的數(shù)據(jù)抓取。STM32F030配置為奇校驗(yàn),無論上位配置了哪一項(xiàng),均能正常接收到數(shù)據(jù)。但是,還是有不同的地方的。如果奇偶校驗(yàn)開啟后,當(dāng)發(fā)生奇偶校驗(yàn)錯(cuò)誤時(shí),會觸發(fā)硬件奇偶校驗(yàn)失敗事件,如果開啟了奇偶校驗(yàn)失敗中斷,那么硬件將進(jìn)入奇偶校驗(yàn)中斷。
以上三個(gè)誤區(qū)筆者已經(jīng)全部分析完畢,那么下面我們將如何針對STM32F030芯片的特性來實(shí)現(xiàn)串口通訊奇偶校驗(yàn)?zāi)?
在下位機(jī)軟件上,通過誤區(qū)一的分析,我們需要將下位機(jī)STM32F030的串口配置為數(shù)據(jù)位9位,奇檢驗(yàn)或偶檢驗(yàn),然后開啟奇偶校驗(yàn)位異常中斷。再通過奇偶校驗(yàn)異常中斷中將此次接收到的數(shù)據(jù)丟棄,以實(shí)現(xiàn)錯(cuò)誤字節(jié)的濾除。這里要特別注意,開啟奇偶校驗(yàn)中斷一定要優(yōu)先配置,至少要在接收中斷開啟之前,具體原因筆者尚未能查詢到。
至于硬件做了些什么,硬件僅僅填充了奇偶校驗(yàn)位,并提示了錯(cuò)誤信息,其并不會為我們主動(dòng)去除接收的數(shù)據(jù)。
對于PC機(jī)上的串口軟件,我們并不需要設(shè)置成為數(shù)據(jù)位9位,而是必須配置成數(shù)據(jù)位8位——當(dāng)然,在筆者下載的幾款串口工具軟件里均無法配置成數(shù)據(jù)9位。相應(yīng)的奇偶校驗(yàn)位需要與下位機(jī)相同即可。
經(jīng)過以上的軟件配置,現(xiàn)在基于STM32F030芯片的通訊已經(jīng)工作正常了,我的經(jīng)驗(yàn)也暫時(shí)總結(jié)到這里了。
在工作中調(diào)試通訊時(shí),發(fā)現(xiàn)有諸多的干擾數(shù)據(jù)出現(xiàn),想想串口通訊除去外部硬件電路去除干擾外,還可以通過軟件來濾掉干擾數(shù)據(jù),于是我就想到了串口通訊中的奇偶校驗(yàn)。印象中,在編寫STM32F030程序初始化串口時(shí),對其配置的時(shí)候有一個(gè)屬性是否使用奇偶檢驗(yàn)。我想,只需要簡單修改一下這一個(gè)屬性,程序便大功告成了??墒墙Y(jié)果真的是我所預(yù)料的嗎?請看下文。
本文引用地址:http://www.ex-cimer.com/article/280413.htm我們先來看一下STM32F030的串口初始化程序,程序清單如下:
USART_InitStructure.USART_BaudRate = 115200; 波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;數(shù)據(jù)位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1;停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No;奇偶校驗(yàn)位無
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;無硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;使能發(fā)送與接收功能
USART_Init(USART1, &USART_InitStructure);初始化串口1
上面這段程序沒有特別之處,廣泛示例于各大論壇,教程,而筆者也只是將上面奇偶校驗(yàn)位這一行,修改為了USART_InitStructure.USART_Parity = USART_Parity_Odd;即奇校驗(yàn)。然后,重新編譯,下載,一切正常??墒?hellip;…
從圖1可以清楚看到,在未修改之前,串口能正常接收到字符串,但是在修改之后,取而待之的都是亂碼。無論P(yáng)C機(jī)軟件配置為奇校驗(yàn),偶檢驗(yàn),還是無奇偶校驗(yàn)均無正確顯示。頓時(shí),整個(gè)人的感覺就不好了。555……
筆者也是借此機(jī)會深入了解了一下奇偶校驗(yàn),與STM32F030芯片上的實(shí)現(xiàn)?,F(xiàn)在將奇偶校驗(yàn)認(rèn)識的三大誤區(qū)及應(yīng)用實(shí)現(xiàn)分享給大家。
誤區(qū)一:修改一下串口配置參數(shù)就可以了嗎?
這個(gè)誤區(qū)我覺得應(yīng)該放在第一位,主要因?yàn)楣P者首先就這樣認(rèn)為的。通過上面的實(shí)例,也已經(jīng)充分說明僅修改一個(gè)屬性是無法實(shí)現(xiàn)的。通過仔細(xì)閱讀編程手冊,發(fā)現(xiàn)在配置奇偶校驗(yàn)屬性后,必須要修改數(shù)據(jù)位為9位,否則PC端無法接收。以下是筆者查詢到的資料(STM32F10xxx參考手冊):
通過上面的截圖(圖2),我們可以看到,如果將串口配置為了奇校驗(yàn),且數(shù)據(jù)位為8位,那么數(shù)據(jù)位的位7將被替換為奇檢驗(yàn)位——也就是說,原有的數(shù)據(jù)被破壞了。這也就證明了圖1為什么會出現(xiàn)亂碼的現(xiàn)象了。
既然發(fā)現(xiàn)了錯(cuò)誤,那就要解決。通過查詢相關(guān)文檔,與詳細(xì)閱讀STM32芯片編程手冊,最后通過以下配置即可實(shí)現(xiàn)正常發(fā)送,與奇偶校驗(yàn)。程序配置清單如下:
USART_InitStructure.USART_WordLength = USART_WordLength_9b;
USART_InitStructure.USART_Parity = USART_Parity_Odd;
如果將數(shù)據(jù)位數(shù)擴(kuò)展成9位,那么奇偶校驗(yàn)位將占用新插入的位8,也就不必破壞原數(shù)據(jù)。通過編譯與下載程序,并在PC機(jī)上驗(yàn)證,此方法確實(shí)可行,PC機(jī)數(shù)據(jù)正常接收,再次重現(xiàn)”Hello EEPW”。
誤區(qū)二:PC機(jī)串口軟件無法實(shí)現(xiàn)奇偶校驗(yàn)發(fā)送?
筆者在查閱資料的時(shí)候發(fā)現(xiàn)有好多網(wǎng)友都有這樣的觀念,但是筆者的PC機(jī)軟件的確是可以發(fā)送奇偶檢驗(yàn)的。通過多次實(shí)驗(yàn)筆者發(fā)現(xiàn),SScomm串口工具軟件v3.2版本無法實(shí)現(xiàn),但SScomm版本v4.2可以實(shí)現(xiàn)。
雖然說是實(shí)現(xiàn)奇偶校驗(yàn),但是僅限發(fā)送時(shí)會發(fā)送嚴(yán)格按照配置要求發(fā)送,即會發(fā)送奇偶校驗(yàn)位,從而下位機(jī)將正常接收。但是接收的時(shí)候,并不表示奇偶校驗(yàn)位錯(cuò)誤,上位機(jī)不會接收數(shù)據(jù)——上位機(jī)的具體實(shí)現(xiàn)也是這樣的。上位機(jī)不管奇偶校驗(yàn)是否正確,仍然會正常顯示接收的數(shù)據(jù),這個(gè)并不影響我們實(shí)際應(yīng)用,也只是說明一下而已。
誤區(qū)三:STM32F030配置了奇偶校驗(yàn)位,就不會接收到錯(cuò)誤的字節(jié)了
很遺憾,這個(gè)也是非常大的誤區(qū)。通過在線仿真的數(shù)據(jù)抓取。STM32F030配置為奇校驗(yàn),無論上位配置了哪一項(xiàng),均能正常接收到數(shù)據(jù)。但是,還是有不同的地方的。如果奇偶校驗(yàn)開啟后,當(dāng)發(fā)生奇偶校驗(yàn)錯(cuò)誤時(shí),會觸發(fā)硬件奇偶校驗(yàn)失敗事件,如果開啟了奇偶校驗(yàn)失敗中斷,那么硬件將進(jìn)入奇偶校驗(yàn)中斷。
以上三個(gè)誤區(qū)筆者已經(jīng)全部分析完畢,那么下面我們將如何針對STM32F030芯片的特性來實(shí)現(xiàn)串口通訊奇偶校驗(yàn)?zāi)?
在下位機(jī)軟件上,通過誤區(qū)一的分析,我們需要將下位機(jī)STM32F030的串口配置為數(shù)據(jù)位9位,奇檢驗(yàn)或偶檢驗(yàn),然后開啟奇偶校驗(yàn)位異常中斷。再通過奇偶校驗(yàn)異常中斷中將此次接收到的數(shù)據(jù)丟棄,以實(shí)現(xiàn)錯(cuò)誤字節(jié)的濾除。這里要特別注意,開啟奇偶校驗(yàn)中斷一定要優(yōu)先配置,至少要在接收中斷開啟之前,具體原因筆者尚未能查詢到。
至于硬件做了些什么,硬件僅僅填充了奇偶校驗(yàn)位,并提示了錯(cuò)誤信息,其并不會為我們主動(dòng)去除接收的數(shù)據(jù)。
對于PC機(jī)上的串口軟件,我們并不需要設(shè)置成為數(shù)據(jù)位9位,而是必須配置成數(shù)據(jù)位8位——當(dāng)然,在筆者下載的幾款串口工具軟件里均無法配置成數(shù)據(jù)9位。相應(yīng)的奇偶校驗(yàn)位需要與下位機(jī)相同即可。
經(jīng)過以上的軟件配置,現(xiàn)在基于STM32F030芯片的通訊已經(jīng)工作正常了,我的經(jīng)驗(yàn)也暫時(shí)總結(jié)到這里了。
評論