|
wince6 s3c2440 串口驱动移植怪异的问题
[复制链接]
最近正在做s3c2440下面的wince6.0 r2移植, 补丁包打到今年的8月份。
移植的主要是三串口驱动,com0作为调试串口,com1发现了一个非常怪异的问题
那就是串口发送数据,在低于17个字符的时候,WriteFile陷入阻塞状态,根本就没有任何反应。
超过17个字符以上一切正常,低于17个字符,就算设置超时时间也不行,使用串口调试工具也是一样,初步判断
是驱动的原因。
我把应用程序源代码和串口的驱动都贴上,哪位大侠有没有遇到过这种问题?
下面的是应用程序代码:
- // SerialTestDlg.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "SerialTest.h"
- #include "SerialTestDlg.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #endif
- // CSerialTestDlg 对话框
- CSerialTestDlg::CSerialTestDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CSerialTestDlg::IDD, pParent)
- , m_bit(_T(""))
- , m_strPort(_T(""))
- , m_strSecond(_T(""))
- , m_nCount(0)
- , m_strMessage(_T(""))
- , m_isLoop(false)
- {
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- }
- void CSerialTestDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- DDX_Text(pDX, IDC_EDIT_BIT, m_bit);
- DDX_Text(pDX, IDC_EDIT_BIT_PORT, m_strPort);
- DDX_Text(pDX, IDC_EDIT_SECOND, m_strSecond);
- DDX_Control(pDX, IDC_BUTTON_SEND, m_button_Send);
- DDX_Text(pDX, IDC_EDIT_COUNT, m_nCount);
- DDX_Text(pDX, IDC_EDIT_MESSAGE, m_strMessage);
- }
- BEGIN_MESSAGE_MAP(CSerialTestDlg, CDialog)
- #if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
- ON_WM_SIZE()
- #endif
- //}}AFX_MSG_MAP
- ON_BN_CLICKED(IDC_BUTTON_SEND, &CSerialTestDlg::OnBnClickedButtonSend)
- ON_BN_CLICKED(IDC_BUTTON_OPEN, &CSerialTestDlg::OnBnClickedButtonOpen)
- END_MESSAGE_MAP()
- // CSerialTestDlg 消息处理程序
- BOOL CSerialTestDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
- // TODO: 在此添加额外的初始化代码
- m_strPort = _T("COM2");
- m_strSecond = "100";
- m_bit = "115200";
- m_strMessage = "agh11111111111111";
- m_isLoop = true;
- UpdateData(FALSE);
- m_button_Send.EnableWindow(FALSE);
-
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
- }
- #if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
- void CSerialTestDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
- {
- if (AfxIsDRAEnabled())
- {
- DRA::RelayoutDialog(
- AfxGetResourceHandle(),
- this->m_hWnd,
- DRA::GetDisplayMode() != DRA::Portrait ?
- MAKEINTRESOURCE(IDD_SERIALTEST_DIALOG_WIDE) :
- MAKEINTRESOURCE(IDD_SERIALTEST_DIALOG));
- }
- }
- #endif
- void CSerialTestDlg::OnBnClickedButtonSend()
- {
- // TODO: 在此添加控件通知处理程序代码
- CString strCaption;
- m_button_Send.GetWindowText(strCaption);
- if(strCaption == "发送")
- {
- OnSend();
- m_button_Send.SetWindowText(_T("暂停"));
- }
- else if (strCaption == "暂停")
- {
- m_button_Send.SetWindowText(_T("发送"));
- }
- }
- BOOL CSerialTestDlg::OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity)
- {
- COMMTIMEOUTS CommTimeOuts;
- // 打开串口
- m_hComm = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, NULL,NULL);
- if(m_hComm == INVALID_HANDLE_VALUE)
- {
- MessageBox(_T("无法打开端口或端口已打开!请检查是否已被占用."));
- return FALSE;
- }
- GetCommState(m_hComm, &dcb); /* 读取串口的DCB */
- dcb.BaudRate = BaudRate;
- dcb.ByteSize = DataBits;
- dcb.Parity = Parity;
- dcb.StopBits = StopBits;
- dcb.fParity = FALSE; /* 禁止奇偶校验 */
- dcb.fBinary = TRUE;
- dcb.fDtrControl = 0; /* 禁止流量控制 */
- dcb.fRtsControl = 0;
- dcb.fOutX = 0;
- dcb.fInX = 0;
- dcb.fTXContinueOnXoff = 0;
- dcb.DCBlength = sizeof(DCB);
- SetupComm(m_hComm, 0, 0); /* 设置接收与发送的缓冲区大小 */
- if(!SetCommState(m_hComm, &dcb)) /* 设置串口的DCB */
- {
- CString str;
- str.Format(_T("无法按当前参数配置端口,lasterror=%d"),GetLastError());
- MessageBox(str,TEXT(" Error"),MB_OK);
- ClosePort();
- return FALSE;
- }
- //初始化缓冲区中的信息 清除
- PurgeComm( m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); //清干净输入、输出缓冲区
- //设置状态参数
- SetCommMask(m_hComm, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型
- //SetCommMask(m_hComm, EV_RXCHAR); /* 串口事件:接收到一个字符 */
- //设置超时参数
- GetCommTimeouts(m_hComm, &CommTimeOuts);
- CommTimeOuts.ReadIntervalTimeout = 100; /* 接收字符间最大时间间隔 */
- CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
- CommTimeOuts.ReadTotalTimeoutConstant = 100; /* 读数据总超时常量 */
- CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
- CommTimeOuts.WriteTotalTimeoutConstant = 0;
- if(!SetCommTimeouts(m_hComm, &CommTimeOuts))
- {
- MessageBox(_T("无法设置超时参数!"));
- ClosePort();
- return FALSE;
- }
- PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); /* 清除收/发缓冲区 */
- return TRUE;
- }
- /*******************************************************************************************
- 函数名称: CSerialPortDlg::ClosePort
- 描 述: 关闭串口
- 输入参数: 无
- 输出参数: 无
- 返 回: FALSE: 失败; TRUE: 成功
- ********************************************************************************************/
- BOOL CSerialTestDlg::ClosePort(void)
- {
- if(m_hComm != INVALID_HANDLE_VALUE)
- {
- SetCommMask(m_hComm, 0);
- PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); /* 清除收/发缓冲 */
- CloseHandle(m_hComm); /* 关闭串口操作句柄 */
- m_hComm = INVALID_HANDLE_VALUE;
- return TRUE;
- }
- return FALSE;
- };
- void CSerialTestDlg::OnBnClickedButtonOpen()
- {
- // TODO: 在此添加控件通知处理程序代码
- UpdateData(TRUE);
- CString strPort = _T("COM3:"); /* 查表获取参数值 */
- DWORD baud = 115200;
- DWORD databit = 8;
- BYTE stopbit = 0;
- BYTE parity = 0;
- BOOL ret = OpenPort(strPort, baud, databit, stopbit, parity); /* 打开串口 */
- if (ret == FALSE)
- return;
- m_button_Send.EnableWindow();
- }
- void CSerialTestDlg::OnSend(void)
- {
- DWORD dwactlen;
- if (m_hComm == INVALID_HANDLE_VALUE)
- {
- MessageBox(_T("串口未打开!"));
- return;
- }
- int len = m_strMessage.GetLength(); /* 取得输入字符串长度 */
- char *psendbuf = new char[len];
- for(int i = 0; i < len;i++)
- psendbuf[i] = (char)m_strMessage.GetAt(i); /* 转换为单字节字符 */
- while (m_isLoop)
- {
- OVERLAPPED olWrite;
- memset(&olWrite,0,sizeof(olWrite));
- olWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
- UpdateData();
- WriteFile(m_hComm, psendbuf, len, &dwactlen, &olWrite); /* 从串口发送数据 */
- m_nCount += len;
- UpdateData(FALSE);
-
- Sleep(_ttoi(m_strSecond.GetBuffer(0)));
- //Sleep(1000);
- }
- delete[] psendbuf;
- }
复制代码
|
|