新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARMLinux(mini2440)串口與51單片機的9位串口通訊

        ARMLinux(mini2440)串口與51單片機的9位串口通訊

        作者: 時間:2016-11-19 來源:網絡 收藏
        51單片機的串口模式在方式2或方式3時為9位通訊方式,即當串行數據第9位為“1”時,前8位數據指示的是用來和主機通訊的從機地址;當串行數據第9位為“0”時,前8位數據則用為真正的數據。具體請參考:
        http://www.eeworld.com.cn/mcu/2011/0621/article_4424_1.html
        而FriendlyARMmini2440可以設置的數據位數為5~8位,即CS5,CS6,CS7,CS8。關于Linux串口的編程教學請參見:http://www.adamjiang.com/pukiwiki/index.php?Linux串口編程詳解#ec39e271
        查閱了一下前人的做法,有兩種:1.硬方法:另加一51單片機的板子來做轉換,串口模式采用方式1來與ARM板通信,另一頭用方式2或3來與9bit的單片機通信;2.軟方法:改驅動,即在linux的串口驅動中加入對第9位的收發。
        我這里是用方法二。一開始很不想改driver,就在網上各種搜,搜到的方法是:采用奇偶校驗的mask和space來設定第九位為“1”或“0”;串口的設置代碼為:
        發地址前:
        struct termios opt;
        opt.c_cflag = BAUDRATE | CS8 | PARENB | PARODD | CMSPAR | CLOCAL | CREAD;
        opt.c_iflag = (INPCK | IGNBRK | IGNPAR);
        發數據前:
        struct termios opt;
        opt.c_cflag = BAUDRATE | CS8 | PARENB | CMSPAR | CLOCAL | CREAD;
        opt.c_cflag &= ~PARODD;
        試過之后發現有時是9bit,有時是8bit,或者是第9bit不受mask和space的控制(測試方式很吐血,直接拿示波器看的,高低電平一個一個數?。???磥磉@樣的設置只是設了奇偶校驗,根本沒設到mask和space,難道是driver不支持?只有這個原因了!于是開始學改driver,最后是在samsung.c這個驅動文件中發現雖然定義了CMSPAR,卻完全沒有用到,于是修改如下:
        修改了如下幾個文件:
        1.
        加入如下兩行:

        2.
        函數 s3c24xx_serial_set_termios()中:
        注釋掉這個:
        修改ulcon寄存器設置,如下:

        接著就是重新編譯內核,通過vivi下載到板上。測試程序中按照上述方法設置結構體termios變量,就可以實現第9位的mask和space了。經測試,mini2440已可與51單片機通信!



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宁波市| 西乡县| 綦江县| 尤溪县| 武陟县| 朝阳市| 北川| 江永县| 中卫市| 蓬安县| 巨鹿县| 绵阳市| 尼勒克县| 辛集市| 桦南县| 讷河市| 泗洪县| 闽侯县| 洛宁县| 崇明县| 吴江市| 民县| 扎赉特旗| 义乌市| 福海县| 香格里拉县| 江源县| 天祝| 浦县| 京山县| 穆棱市| 石嘴山市| 长垣县| 怀柔区| 常宁市| 绥德县| 都安| 顺平县| 德州市| 威远县| 区。|