主题 : mini2440串口不稳定问题 复制链接 | 浏览器收藏 | 打印
学习WHY而不是学习HOW
级别: 新手上路
UID: 39775
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
综合积分: 6 分
注册时间: 2011-03-12
最后登录: 2013-06-19
楼主  发表于: 2011-05-13 20:46

 mini2440串口不稳定问题

大家好,头一次发帖.

客套话不多说,直入主题吧:)

我购买的是micro2440a70套装,板子上有三个串口,而现在遇到一个COM3不稳定的问题,具体如下:

系统环境:

光盘自带的WINCE6

软件环境:

使用VB.NET2008编写的串口数据采集与控制软件,主要功能:
    一,从COM1,COM2采集485总线数据.
         COM口的2与3脚是交错的,并且4脚与7脚电压不足,导致串口窃电的232转485模块无法工作,通过自制一条带USB取电的串口交连线解决.
    二,从COM3与一块串口IO卡通讯.    <------目前卡在这里.

问题现象:

    每次WINCE6启动后,COM1与COM2可以马上工作,即打开端口没有问题.COM3有时能打开,有时不能打开.
    然而WINCE6自带的串口调试工具却可以成功打开COM3并与IO卡正确通讯,任何时候都可以.

我做过的尝试:

    在PC上联调时,单步到OPEN端口后,然后查看错误描述,如下:

在 System.IO.IOException 中第一次偶然出现的“System.dll”类型的异常
在 System.IO.IOException 中第一次偶然出现的“System.dll”类型的异常

由于不清楚原因,能做的尝试极为有限....

不知道系统自带的那个工具为何能正确打开COM3?能否提供其实现机制?最好能有代码!

另外,打开三个COM口的代码均为同一份代码的复制,相关代码如下:

Imports System
Imports System.IO.Ports
Imports System.Windows.Forms

Public Class cIoCard
    'IO卡操作类
    '
    'IO卡使用COM3,参数=9600,n,8,1
    '
    '思路:
    '
    '本类内部保存IO口状态.
    '用一个定时器不断从IO卡取得输入状态,每秒10次(100ms一次),如果与内部保存的状态不同,则产生IOChanged事件.
    '提供方法可设置输出口状态,同时会触发IOChanged事件.
    '提供方法可取得当前输入口状态.

    Public Event IChanged(ByVal bNum() As Byte)       'Input有改变事件.有改变的口被置1
    Public Event OChanged(ByVal bNum() As Byte)       'Output有改变事件.有改变的口被置1

    Public Enum IOSTATUE
        R_BIT_ON = &H1
        R_BIT_OFF = &H2
        R_ALL_ON = &H3
        R_ALL_OFF = &H4
        R_GROUP_ON = &H5
        R_GROUP_OFF = &H6
        READ_STATUS = &H7
        STATUS_FROM_BOARD = &H20
    End Enum

    Dim WithEvents oComm As SerialPort
    Dim WithEvents oTimerR As Timer, oTimerW As Timer
    Dim bIs(7) As Byte, bOs(7) As Byte, OutByte(8) As Byte

    Public Sub New(ByVal T1 As Timer, ByVal T2 As Timer)
        If (T1 Is Nothing) Or (T2 Is Nothing) Then
            Throw New ArgumentException("control不能为空!", "control")
        Else
            oTimerR = T1
            oTimerW = T2
        End If
    End Sub

    Public Function OpenComm() As Integer
        '初始化串口
        oComm = New SerialPort

        With oComm
            .ReadTimeout = 100
            .WriteTimeout = 100
            .BaudRate = 9600
            .DataBits = 8
            .StopBits = IO.Ports.StopBits.One
            .Parity = IO.Ports.Parity.None
            Try
                .PortName = "COM3"
                .Open()
            Catch ex As Exception
                Return -1
                'MsgBox("打开串口错误!")
            End Try
        End With

        oTimerR.Interval = 25
        'oTimerW.Interval = 100
        oTimerR.Enabled = True
        'oTimerW.Enabled = True
        Return 1
    End Function

请求大家的帮助:)
学习WHY而不是学习HOW
级别: 骑士
UID: 37749
精华: 0
发帖: 162
金钱: 835 两
威望: 167 点
综合积分: 324 分
注册时间: 2011-02-16
最后登录: 2017-09-13
1楼  发表于: 2011-05-16 16:34
建议您简化您的程序,一行行查,看是哪行导致的问题
级别: 骑士
UID: 37749
精华: 0
发帖: 162
金钱: 835 两
威望: 167 点
综合积分: 324 分
注册时间: 2011-02-16
最后登录: 2017-09-13
2楼  发表于: 2011-05-16 16:35
我们有串口通信的例程,您可以参考
学习WHY而不是学习HOW
级别: 新手上路
UID: 39775
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
综合积分: 6 分
注册时间: 2011-03-12
最后登录: 2013-06-19
3楼  发表于: 2011-08-20 17:40
谢谢,现在我使用代码完成串口的读写,不再使用系统提供的控件,就可靠了.
学习WHY而不是学习HOW