把COM0变成可以用的普通串口

本文介绍如何将友坚6410开发板的默认调试串口从COM0修改为COM3,并解决了修改后导致的问题。通过调整bat文件及注册表设置,成功实现了串口的功能转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把COM0变成可以用的普通串口了。我修改的地方如下:

1.smdk6410.bat里
set BSP_NOUART0=1将这句的值去掉
set BSP_DEBUGPORT=SERIAL_UART0将这句屏蔽掉

2.OAL下debug.c
把判断debug_port的分支和条件都注掉,只留一个想改为调试口的分支的实现部分。

修改后:

修改前如下:

3.smdk6410_serial.cpp
SetDTR()实现注掉。

具体怎么注释掉还不清楚。

 

 

前两步没有悬念。只做前两步的话,可以看到COM0不输出wince的启动信息,改由COM3输出。但在应用程序中调用CreateFile无法打开COM0,错误号55。注册表中看到当前加载的已经是COM0~2,应当没有错误才是。比较COM0和COM3输出的启动信息,在COM3输出时多出了以下一段话:

DEBUG: CreateSerialObject 0
-OALIntrRequestSysIntr(irq = 61, sysIntr = 33)

 

输出的错误到这里。

 


Exception 'Data Abort' (4): Thread-Id=00d20002(pth=85b71510), Proc-Id=00400002(pprc=823f9308) 'NK.EXE', VM-active=01e90002(pprc=85af9780) 'udevice.exe'
PC=c0d01e40(smdk6410_serial.dll+0x00001e40) RA=c0d01d94(smdk6410_serial.dll+0x00001d94) SP=d27ae904, BVA=00000000
Exception 'Raised Exception' (-1): Thread-Id=00d20002(pth=85b71510), Proc-Id=00400002(pprc=823f9308) 'NK.EXE', VM-active=01e90002(pprc=85af9780) 'udevice.exe'
PC=c003bc70(k.coredll.dll+0x0001bc70) RA=8011c4c8(kernel.dll+0x000064c8) SP=d27ae1a0, BVA=ffffffff
Exception 'Prefetch Abort' (3): Thread-Id=04a90002(pth=85784324), Proc-Id=00400002(pprc=823f9308) 'NK.EXE', VM-active=01e90002(pprc=85af9780) 'udevice.exe'
PC=c0d02f90(???+0xc0d02f90) RA=c004bdc4(k.coredll.dll+0x0002bdc4) SP=d327fe84, BVA=c0d02f90

 

--------------------------------------------------------------------------------------------------------------------------------------------

友坚6410其BSP的默认调试串口为com0(STEPLDR、EBOOT、Wince的都是),现在在wince中使用COM0想把调试口修改到wince的COM3,可以如下操作。

修改E:/WINCE600/PLATFORM/SMDK6410/SMDK6410.bat中的

set BSP_NOUART0=1
set BSP_NOUART1=
set BSP_NOUART2=
set BSP_NOUART3=

……

set BSP_DEBUGPORT=SERIAL_UART0
@REM set BSP_DEBUGPORT=SERIAL_UART1
@REM set BSP_DEBUGPORT=SERIAL_UART2
@REM set BSP_DEBUGPORT=SERIAL_UART3

修改为:

set BSP_NOUART0=
set BSP_NOUART1=
set BSP_NOUART2=
set BSP_NOUART3=1

……

@REM set BSP_DEBUGPORT=SERIAL_UART0
@REM set BSP_DEBUGPORT=SERIAL_UART1
@REM set BSP_DEBUGPORT=SERIAL_UART2
set BSP_DEBUGPORT=SERIAL_UART3

重新生成STEPLDR.bin、EBOOT.bin、nk.bin烧入核心板启动,Wince启动后在

DEBUG: CreateSerialObject 2

OALIntrRequestSysIntr(irq = 63, sysIntr = 30)

卡住

寻找资料后,需要修改E:/WINCE600/PLATFORM/SMDK6410/CESYSGEN/files/platform.reg,把

;IF BSP_NOUART2 !
;IF BSP_KITL != SERIAL_UART2
;IF BSP_NOIRDA2
;--------------- UART2 (Physical COM2 Port) ----------------------------------
;[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Serial2]
; "DeviceArrayIndex"=dword:2
; "Irq"=dword:3F    ; UART2 Virtual IRQ = 63 (0x3F), Physical IRQ = 39
; "MemBase"=dword:7F005800
; "MemLen"=dword:40
;;    "ISTTimeouts"=dword:200  ; every 512 ticks checking Modem status.
; "Prefix"="COM"
; "Index"=dword:3
; "Dll"="smdk6410_serial.dll"
; "Order"=dword:30
; "Port"="COM3:"
;   "DeviceType"=dword:0
;    "FriendlyName"=LOC_DISPLAYNAME_COM3
;    "Tsp"="unimodem.dll"
;    "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
;    "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
;--------------------------------------------------------------------------
;ENDIF
;ENDIF
;ENDIF

;IF BSP_NOUART3 !
;IF BSP_KITL != SERIAL_UART3
;IF BSP_NOIRDA3
;--------------- UART3 (Physical COM2 Port) ----------------------------------
;[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Serial3]
; "DeviceArrayIndex"=dword:3
; "Irq"=dword:40    ; UART3 Virtual IRQ = 64 (0x40), Physical IRQ = 40
; "MemBase"=dword:7F005C00
; "MemLen"=dword:40
;; "ISTTimeouts"=dword:200  ; every 512 ticks checking Modem status.
; "Prefix"="COM"
; "Index"=dword:4
; "Dll"="smdk6410_serial.dll"
; "Order"=dword:30
; "Port"="COM4:"
; "DeviceType"=dword:0
; "FriendlyName"=LOC_DISPLAYNAME_COM4
; "Tsp"="unimodem.dll"
; "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
; "DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
;;--------------------------------------------------------------------------
;ENDIF
;ENDIF
;ENDIF

这部分全部注释即可解决以上问题。

 

CSerialPort First Version by Remon Spekreijse on 2000-02-08 http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483/A-communication-class-for-serial-port.htm Second Version by mrlong on 2007-12-25 https://code.google.com/p/mycom/ 增加 ClosePort 增加 WriteToPort 两个方法 增加 SendData 与 RecvData 方法 by liquanhai on 2011-11-04 http://blog.youkuaiyun.com/liquanhai/article/details/4955253 增加 ClosePort 中交出控制权,防止死锁问题 by liquanhai on 2011-11-06 http://blog.youkuaiyun.com/liquanhai/article/details/6941574 增加 ReceiveChar 中防止线程死锁 by viruscamp on 2013-12-04 https://github.com/viruscamp/CSerialPort 增加 IsOpen 判断是否打开 修正 InitPort 中 parity Odd Even 参数取值错误 修改 InitPort 中 portnr 取值范围,portnr>9 时特殊处理 取消对 MFC 的依赖,使用 HWND 替代 CWnd,使用 win32 thread 函数而不是 MFC 的 增加用户消息编号自定义,方法来自 CnComm by itas109 on 2014-01-10 http://blog.youkuaiyun.com/itas109/article/details/18358297 解决COM10以上端口无法显示的问题 扩展可选择端口,最大值MaxSerialPortNum可以自定义 添加QueryKey()和Hkey2ComboBox两个方法,用于自动查询当前有效的串口号。 by liquanhai on 2014-12-18 增加一些处理措施,主要是对减少CPU占用率 by itas109 on 2016-05-07 http://blog.youkuaiyun.com/itas109 修复每次打开串口发送一次,当串口无应答时,需要关闭再打开或者接收完数据才能发送的问题。 解决办法:在m_hEventArray中调整m_hWriteEvent的优先级高于读的优先级。CommThread(LPVOID pParam)函数中读写的位置也调换。 参考:http://zhidao.baidu.com/link?url=RSrbPcfTZRULFFd2ziHZPBwnoXv1iCSu_Nmycb_yEw1mklT8gkoNZAkWpl3UDhk8L35DtRPo5VV5kEGpOx-Gea 修复停止位在头文件中定义成1导致SetCommState报错的问题,应为1对应的停止位是1.5。UINT stopsbits = ONESTOPBIT switch(stopbits)和switch(parity)增加默认情况,增强程序健壮性 by itas109 on 2016-06-22 http://blog.youkuaiyun.com/itas109 增加ReceiveStr方法,用于接收字符串(接收缓冲区有多少字符就接收多少字符)。 解决ReceiveChar只能接收单个字符的问题。 by itas109 on 2016-06-29 http://blog.youkuaiyun.com/itas109 解决RestartMonitoring方法和StopMonitoring方法命令不准确引起的歧义,根据实际作用。 将RestartMonitoring更改为ResumeMonitoring,将StopMonitoring更改为SuspendMonitoring。 增加IsThreadSuspend方法,用于判断线程是否挂起。 改进ClosePort方法,增加线程挂起判断,解决由于线程挂起导致串口关闭死锁的问题。 增加IsReceiveString宏定义,用于接收时采用单字节接收还是多字节接收 by itas109 on 2016-08-02 http://blog.youkuaiyun.com/itas109 https://github.com/itas109 改进IsOpen方法,m_hComm增加INVALID_HANDLE_VALUE的情况,因为CreateFile方法失败返回的是INVALID_HANDLE_VALUE,不是NULL 改进ClosePort方法:增加串口句柄无效的判断(防止关闭死锁);m_hWriteEvent不使用CloseHandle关闭 改进CommThread、ReceiveChar、ReceiveStr和WriteChar方法中异常处理的判断,增加三种判断:串口打开失败(error code:ERROR_INVALID_HANDLE)、连接过程中非法断开(error code:ERROR_BAD_COMMAND)和拒绝访问(error code:ERROR_ACCESS_DENIED) 采用安全函数sprintf_s和strcpy_s函数替换掉sprintf和strcpy 改进QueryKey方法,用于查询注册表的可用串口值,可以搜索到任意的可用串口 改进InitPort方法,串口打开失败,增加提示信息:串口不存在(error code:ERROR_FILE_NOT_FOUND)和串口拒绝访问(error code:ERROR_ACCESS_DENIED) 加入viruscamp 取消对 MFC 的依赖 改进InitPort方法,如果上次串口是打开,再次调用InitPort方法,关闭串口需要做一定的延时,否则有几率导致ERROR_ACCESS_DENIED拒绝访问,也就是串口占用问题 初始化默认波特率修改为9600 修复一些释放的BUG 规范了一些错误信息,参考winerror.h -- error code definitions for the Win32 API functions 删除SendData和RecvData方法 by itas109 on 2016-08-10 http://blog.youkuaiyun.com/itas109 https://github.com/itas109 改进ReceiveStr方法,comstat.cbInQue = 0xcccccccc的情况(如串口异常断开),会导致RXBuff初始化失败 by itas109 on 2017-02-14 http://blog.youkuaiyun.com/itas109 https://github.com/itas109 兼容ASCII和UNICODE编码 ReceiveStr函数中发送函数SendMessage的第二个参数采用结构体形式,包括portNr串口号和bytesRead读取的字节数,可以处理16进制的时候0x00截断问题 精简不必要的函数SendData和RecvData 尽量的取消对 MFC 的依赖,Hkey2ComboBox函数暂时保留 其他小问题修改 博客:blog.youkuaiyun.com/itas109 Email:itas109@qq.com
<think>嗯,用户想在树莓派上配置串口,但不启用串口控制台。我需要回忆一下相关的步骤。首先,树莓派的串口默认可能被控制台占用,所以需要关闭这个功能。根据引用[1],启用串口控制台是通过设置界面,然后重启。但用户不想启用控制台,所以应该反向操作,也就是关闭控制台。 然后,引用[1]还提到要关闭控制台功能,可能需要修改/boot/config.txt和/cmdline.txt文件。在config.txt里添加enable_uart=1,同时检查是否有console=serial0,115200这样的参数在cmdline.txt里,如果有的话要删除,这样才能释放串口普通通信使用。 接下来,引用[3]中的例子使用了/dev/ttyAMA0和ttyAMA1,这可能涉及到不同树莓派版本的串口设备名称变化。比如,树莓派4的串口设备可能是ttyS0或者ttyAMA0,需要确认系统里的实际设备名。用户可能需要使用raspi-config工具来禁用串口控制台,这可能在Interfacing Options里的Serial选项中设置,关闭shell访问,但保持硬件启用。 还有,引用[2]提到修改串口映射关系,可能涉及到设备树覆盖或者修改映射文件,比如使用dtoverlay=disable-bt来禁用蓝牙,将主串口恢复为GPIO引脚上的UART。这样,串口设备可能变成ttyAMA0,而蓝牙使用的可能是ttyS0或其他。 另外,权限问题也很重要。用户可能需要将用户添加到dialout组,以便访问串口设备,避免权限不足的错误。比如使用sudo usermod -aG dialout pi,然后重启。 测试部分,引用[3]中的Python代码使用了serial库,所以需要安装pyserial。用户需要确保安装了这个库,并正确指定端口名称,比如/dev/ttyAMA0或/dev/ttyS0,根据具体的配置情况。 可能遇到的问题包括:配置修改后没有重启导致不生效,设备名不正确,或者权限问题。需要检查dmesg | grep tty查看串口设备,以及ls -l /dev/ttyAMA*确认权限。 总结步骤应该是:1. 禁用串口控制台,修改config.txt和cmdline.txt;2. 调整串口映射(如需要);3. 处理权限;4. 测试。需要确保每个步骤都正确执行,避免遗漏。</think>### 分步配置方法 #### 1. **禁用串口控制台** 树莓派默认将串口分配给控制台(用于调试输出),需通过修改系统配置释放串口普通通信使用: - **步骤1**:编辑 `/boot/config.txt` 文件,添加以下配置: ```bash sudo nano /boot/config.txt ``` 添加或修改: ``` enable_uart=1 dtoverlay=disable-bt # 若需使用主串口(GPIO14/15),禁用蓝牙占用 ``` - **步骤2**:编辑 `/boot/cmdline.txt`,删除涉及串口控制台的参数(如 `console=serial0,115200`)[^1]: ```bash sudo nano /boot/cmdline.txt ``` 修改后的内容类似: ``` dwc_otg.lpm_enable=0 console=tty1 root=PARTUUID=xxxx rootfstype=ext4 fsck.repair=yes rootwait ``` #### 2. **调整串口映射(可选)** 若需使用额外串口(如 `/dev/ttyAMA1`),需通过设备树覆盖(Device Tree Overlay)重新映射引脚: - 在 `/boot/config.txt` 中添加设备树配置: ``` dtoverlay=uart3 # 启用UART3(映射到GPIO4/5) dtoverlay=uart4 # 启用UART4(映射到GPIO8/9) ``` #### 3. **设置用户权限** 将用户加入 `dialout` 组以获取串口访问权限: ```bash sudo usermod -aG dialout $USER sudo reboot ``` #### 4. **验证配置** - **重启后检查串口设备**: ```bash ls /dev/ttyAMA* # 主串口可能为ttyAMA0或ttyS0(根据配置) ``` - **Python测试代码**(需安装 `pyserial`): ```python import serial uart = serial.Serial(port="/dev/ttyAMA0", baudrate=115200) uart.write("Test message".encode()) ``` ### 关键注意事项 - **串口设备名称**:树莓派4中,主串口可能为 `/dev/ttyS0`(mini-UART)或 `/dev/ttyAMA0`(PL011 UART),具体取决于蓝牙是否禁用[^3]。 - **稳定性问题**:mini-UART(ttyS0)的波特率依赖CPU时钟,建议通过 `force_turbo=1` 固定时钟(需权衡功耗)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值