WinCE下调试串口的动态复用

      车机项目中用到了很多串口外设,如DVD机芯、GPS、蓝牙、雷达和胎压监测等,而主CPU(TCC89XX)与小MCU(STM32)之间也是通过串口通讯的。一时之间,串口使用有点捉襟见肘的感觉,只能把调试串口拿出来用做普通串口。

      调试串口用作普通串口本身没什么问题,之前在S3C2410上也做过。当时是把2410的调试串口强制改为普通串口,系统启动后调试串口就无法正常使用了。但目前的项目仍在进一步完善之中,调试串口还是相当重要的,经常需要通过它,抓一些TRACE来分析和定位问题。所以,希望UART0能在调试串口和普通串口之间方便切换。

      同一时刻,UART0既用作调试串口,又用作普通串口似乎不可能,并且意义也不大。考虑了一个简单的方法,系统默认将UART0用作普通串口,需要抓取TRACE时,在应用程序中配置UART0的工作模式为调试串口,然后重启系统。

      熟悉WinCE6.0启动过程的都知道,调试串口的初始化是在WinCE内核启动的最初阶段,《S3C2410下WinCE6.0的启动过程详解》曾有介绍,感兴趣的话可以看一看。调试串口的初始化代码一般在BSP目录下的Src\OAL\OALLIB\debug.c文件中。在该文件中主要做了两处修改,如下。

1 void OEMInitDebugSerial() 
2 {
3     pVirtualBOOTARGS = (tSYSTEM_PARAM *)OALPAtoVA(SYSTEM_PARAM_BASEADDRESS,FALSE);
4 }

    此处增加了获取系统配置参数的虚拟地址。

 1 //------------------------------------------------------------------------------
 2 //
 3 //  Function:  OEMWriteDebugString
 4 //
 5 //  Output unicode string to debug serial port
 6 //
 7 VOID OEMWriteDebugString(UINT16 *string)
 8 {
 9     if (!pVirtualBOOTARGS->SysConfig.fDisableDebugSerial)
10     {
11         while (*string != L'\0') OEMWriteDebugByte((UINT8)*string++);
12     }
13 }

      其中,pVirtualBOOTARGS->SysConfig.fDisableDebugSerial为控制调试串口是否正常输出字符的变量。SysConfig是保存在NAND Flash中特定区域的一个结构体,BOOT启动时可以读取到,并且放在内存的指定位置。应用程序中可以修改该结构,相关代码如下。

 1 void SysDisableDebugSerial(int nDisable)
 2 {
 3     GetSysConfig(&gSYSCONFIG);
 4     gSYSCONFIG.fDisableDebugSerial = nDisable;
 5     SetSysConfig(&gSYSCONFIG);
 6 }
 7 
 8 
 9 
10 void CSysAppDlg::OnBnClickedCheckDebugserial()
11 {
12     // TODO: 在此添加控件通知处理程序代码
13     CReg Reg;
14 
15     UpdateData(TRUE);
16     SysDisableDebugSerial(m_bDisableDebugSerial);
17 
18     Reg.Open(HKEY_LOCAL_MACHINE, _T("Drivers\\BuiltIn\\Serial3"), KEY_ALL_ACCESS);
19     Reg.SetSZ(_T("Dll"), m_bDisableDebugSerial ? _T("tcc_serial.dll") : _T("-tcc_serial.dll"));
20     Reg.Flush();
21 }

       可以看到,在修改变量fDisableDebugSerial的同时,还需要修改UART0对应的注册表。在禁用调试串口时,DLL键值设置为正确的,在启用调试串口时,DLL键值前加一个中横杠。确保UART0要么用作调试串口,要么用作普通串口,二者必居其一。应用程序设置界面如下图所示。

     

      经测试,以上修改基本达到了预计的效果,实现了WinCE下调试串口的动态复用。

时间: 2024-10-24 20:20:20

WinCE下调试串口的动态复用的相关文章

请教用VS2008写的在wince下的串口程序

问题描述 请教用VS2008写的在wince下的串口程序,用串口调试工具收发都正常,但是和单片机M16连接看不到的字符.M16单片机发送的字符用串口调试工具,发送是正常啊 解决方案 解决方案二:友情帮顶下!顺便学习学习!解决方案三:帮顶,原来研究过WINCE,但是不够深入解决方案四:俺也要写CE程序了,解决方案五:该回复于2010-12-01 13:15:41被版主删除解决方案六:求一个WINCE下的串口调试工具~~看到网上有很多,就是下载不了,急~~~麻烦有的能给我发一个吗~~64904840

求助?WinCE下的串口编程

问题描述 刚刚接触wince5.0,现在要做一个串口通信程序.要怎么做啊?用的是VS2005开发工具!我连到PDA上测试,提示:无法找到PInvokeDLL"Comm.dll"PS:我download了一个Comm.dll文件放到项目的binDebug目录下还是不行? 解决方案 解决方案二:WinCE的缺省Deployment目录是ProgramFiles[你的工程名]你所需要的是先在WinCE上新建这样一个目录,然后把PInvoke所需的dll复制进去,再进行调试解决方案三:试过了,

WinCE下串口虚拟软件

    前段时间,介绍了一个WinCE下的串口调试软件Serial Splitter Mobile 3.2.它的主要功能是将一个物理串口克隆成N个,供不同的应用程序使用,以监视物理串口收发的数据.今天介绍一个WinCE下的串口虚拟软件VSPD Mobile 4.2.它的特点是可以创建N对纯虚拟串口,并实现虚拟串口对之间的通讯.很多GPS玩家应该都用过这软件.        VSPD Mobile 4.2使用截图如下:               如上图所示,通过VSPD,创建了一对虚拟串口COM

WinCE下的GPS设备操作

通常,GPS接收机被设计成为标准串口设备,不管是CF接口还是蓝牙接口,都被映射成为串口设备,因此,在程序员的眼中,只需如同一般的串口设备来对待即可(对于蓝牙GPS,当然我们也可以通过蓝牙API,在程序中完成设备搜索.映射工作,而减少用户手工处理的麻烦).借助前一篇文章"WinCE下的串口操作"提供的串口类库,我们可以很方便的建立一个GPS类库,但在这个工作之前,我们还是简单的看一下GPS设备的工作过程:GPS是美国提供的一套基于卫星的全球定位系统,它由天空中运行着的24颗卫星组建的星座

WinCE下GPRS自动拨号软件(GPRS AutoDial)

之前在WinCE下调试USB的3G Modem时,写过一个拨号助手RASManager,基本能用.后来车机卖到俄罗斯去,客户老M提供了一个更好的GPRS自动拨号软件GPRS AutoDial,功能完善且强大,RASManager基本就废弃了. GPRS AutoDial的使用方法如下图所示. GPRS AutoDial v1.4.3下载地址,http://files.cnblogs.com/files/we-hjb/GPRS_AD_1.4.3.rar

WinCE下WIFI模块AR6102的调试

      今天调试了一款SDIO的无线网卡AR6102,由于该芯片是板载的,所以写了一个应用程序,模拟无线网卡的插入拔出,然后简单修改了SDHC驱动,检测应用程序发出的模拟卡插拔的动作,并控制芯片的PWR和RST引脚.幸运的很,改完之后,就可以用了.通过应用程序模拟无线网卡的插入动作后,在超级终端看到了加载无线网卡驱动的打印信息,在控制面板的网络连接里也看到了WIFI设备,AR6K_SD1.       用于测试的无线AP是Cisco的,加密方式是WPA-Personal,根据路由器的设置,选

wince C#调试出现:0x80070070: 磁盘空间不足

用C#做界面,效率比MFC要高的多. wince 下,如果需要制作界面,或者需要访问sqlce数据库,C#就非常方便了,如果用MFC,你会发现,访问sqlce 数据库需要设置很多COM接口很麻烦.   初次使用C#开发智能设备应用程序,也就是在wince上运行的应用程序,用VS2005把C#界面程序写好之后,然后编译调试下载. 出现了0x80070070: 磁盘空间不足   错误信息如下:   ------ 已启动生成: 项目: File_cp, 配置: Debug Any CPU ------

嵌入式开发修改u-boot与Linux调试串口总结

近期一个嵌入式开发项目,使用TI Cortex-A8的芯片AM3517作为主控开发.前期使用某公司的核心板搭建开发环境.在自己做底板布板的时候的时候涂个布线方便,改用UART1作为调试串口,而原来某公司给的开发包,已经TI的AM3517 PSP均以UART3作为调试串口.于是在底板焊接完成调试的时候就有了一天痛苦的经历. 嵌入式开发.jpg 在原版的PSP中, 一共有五处使用到UART3作为打印和调试串口: (1)Xloader的打印串口 (2)u-boot的打印串口 (3)内核解压时的信息打印

串口通讯-Linux下多线程串口通信问题

问题描述 Linux下多线程串口通信问题 我做的一个项目,把串口读写采用了一个独立的线程,进行数据的读写,在调试时,发现只要启动另外一个计算量比较大的线程,串口通信就出错了,而只要不启动这个线程,可以启动其他线程,串口工作没有任何问题,求原因? 解决方案 在C#中使用SerialPort类实现串口通信,多线程问题在C#中使用SerialPort类实现串口通信 遇到多线程问题在C#中使用SerialPort类实现串口通信 遇到多线程问题 解决方案二: 这两个线程有耦合吧?认真分析一下之间的联系.可