7601|11

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求解:关于6410串口应用程序的问题? [复制链接]

我用VS2005编写的串口应用程序,写好后同步到6410板子上结果点 打开串口不成功,请各位大虾帮忙看看程序该怎么写,谢谢!部分程序复制如下:
  ……
//打开串口
BOOL Cserial1Dlg::OpenPort(LPCTSTR Port, int BaudRate, int DataBits, int StopBits, int Parity)
{
    COMMTIMEOUTS CommTimeOuts;  //创建超时变量参数
    DWORD error;                //获得错误代码
    //打开串口
    hComm = CreateFile(Port, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    if(hComm == INVALID_HANDLE_VALUE)
    {
     error=GetLastError();
     MessageBox(_T("无法打开端口或端口已打开!请检查是否已被占用."));
     return FALSE;
    }
    GetCommState(hComm, &dcb);        /* 读取串口的DCB */
    dcb.BaudRate= BaudRate;                   /*设置波特率*/
    dcb.ByteSize = DataBits;                        /*设置数据位*/
    dcb.Parity= Parity;                             /*设置校验位*/
    dcb.StopBits= StopBits;                         /*设置停止位*/
    dcb.fParity= FALSE;      /* 禁止奇偶校验*/
    dcb.fBinary= TRUE;
    dcb.fOutX= 0;
    dcb.fInX= 0;
    //设置状态参数
    SetCommMask(hComm, EV_RXCHAR);     /* 串口事件:接收到一个字符*/
    SetupComm(hComm, 16384, 16384);     /* 设置接收与发送的缓冲区大小*/
    SetCommState(hComm, &dcb);
    BOOL isSucces=SetCommState(hComm, &dcb);/* 设置串口的DCB */
   if(!isSucces)     
    {  
    error=GetLastError();
    MessageBox(_T("无法按当前参数配置端口,请检查参数!"));
    ClosePort();
    return FALSE;
}

GetCommTimeouts(hComm, &CommTimeOuts);              /*获得超时参数*/  
//设置超时参数
CommTimeOuts.ReadIntervalTimeout = 100;    /* 接收字符间最大时间间隔*/
CommTimeOuts.ReadTotalTimeoutMultiplier = 1;  
CommTimeOuts.ReadTotalTimeoutConstant = 100;  /* 读数据总超时常量*/
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;  
if(!SetCommTimeouts(hComm, &CommTimeOuts))
{
  MessageBox(_T("无法设置超时参数!"));
  ClosePort();
  return FALSE;
}
PurgeComm(hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);  /* 清除收/发缓冲区*/
return TRUE;  
}


BOOL Cserial1Dlg::ClosePort(void)
{
if(hComm != INVALID_HANDLE_VALUE)
{
  SetCommMask(hComm, 0); //通知线程退出
  PurgeComm(hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); /* 清除收/发缓冲*/
  CloseHandle(hComm);        /* 关闭串口操作句柄*/
  hComm = INVALID_HANDLE_VALUE;
  return TRUE;
}
return FALSE;
}

void CALLBACK Cserial1Dlg::OnComRecv(CWnd* pWnd, char *buf, int buflen)
{   
   CString tmp;
      Cserial1Dlg *pDlg = (Cserial1Dlg*)pWnd;
   CEdit *pRecvStrEdit = (CEdit*)pDlg->GetDlgItem(IDC_REV); //获取接收区指针
   for (int i = 0; i < buflen; i++, buf++)
{
  tmp.Format(_T("%c"), *buf); /* 将字符转换为字符串*/
  pDlg->strRecDisp += tmp;
}
pRecvStrEdit->SetWindowText(pDlg->strRecDisp); /* 显示在窗口上*/
}

DWORD Cserial1Dlg::ComRecvThread(LPVOID lparam)
{
    DWORD dwLength;
char *recvBuf = new char[1024];
Cserial1Dlg*pDlg = (Cserial1Dlg*)lparam;

while(TRUE)
{  
  /* 等待线程退出事件*/
  if (WaitForSingleObject(pDlg->ExitThreadEvent, 0) == WAIT_OBJECT_0)
   break;

  if (pDlg->hComm != INVALID_HANDLE_VALUE)
  {            /* 从串口读取数据*/
   BOOL fReadState = ReadFile(pDlg->hComm, recvBuf, 1024, &dwLength, NULL);
   if(!fReadState)
   {
    MessageBox(_T("无法从串口读取数据!"));
   }
   else
   {
    if(dwLength != 0)
    OnComRecv(pDlg, recvBuf, dwLength-2);  /* 接收成功调用回调函数*/
   }
  }
}  
delete[] recvBuf;
return 0;
}

void Cserial1Dlg::OnOpenCom()
{  
DWORD IDThread;
HANDLE hRecvThread;
UpdateData(TRUE);                           /*把控件的值传给变量*/
CString strPort =_T("COM1:");    /* 设置串口号*/
DWORD baud  = 115200;                  /* 设置波特率*/
DWORD databit   = 8;                         /* 设置数据位*/
BYTE stopbit    = ONESTOPBIT;                /* 设置停止位*/
BYTE parity  = NOPARITY;              /* 设置校验位*/
BOOL ret = OpenPort(strPort, baud, databit, stopbit, parity); /* 打开串口*/
if (ret == FALSE)
  return;
ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); /* 创建串口接收线程退出事件*/
hRecvThread = CreateThread(0, 0, ComRecvThread, this, 0, &IDThread);
if (hRecvThread == NULL)
{
  MessageBox(_T("创建接收线程失败!"));
  return;
}
CloseHandle(hRecvThread);
ButOpen.EnableWindow(FALSE);     /* 打开端口按键禁止*/   
ButClose.EnableWindow(TRUE);     /* 关闭端口按键使能*/
MessageBox(_T("打开串口COM1成功!"));

}
//“关闭串口”消息处理
void Cserial1Dlg::OnCloseCom()
{
   if (ExitThreadEvent != NULL)
{
  SetEvent(ExitThreadEvent);     /* 通知线程退出*/
  Sleep(1000);
  CloseHandle(ExitThreadEvent);
  ExitThreadEvent = NULL;
}

ButOpen.EnableWindow(TRUE);      /* 打开端口按键禁止*/   
ButClose.EnableWindow(FALSE);      /* 关闭端口按键使能*/
ClosePort();                                 
}
//“发送”消息处理
void Cserial1Dlg::OnSend()
{
DWORD dwactlen;
     char *recvBuf = new char[1024];
if (hComm == INVALID_HANDLE_VALUE)
{
  MessageBox(_T("串口未打开!"));
  return;
}
UpdateData(TRUE);
int len = strSendEdit.GetLength();     /* 取得输入字符串长度*/
char *psendbuf = new char[len];

for(int i = 0; i < len;i++)
  psendbuf = (char)strSendEdit.GetAt(i);   /* 转换为单字节字符*/

WriteFile(hComm, psendbuf, len, &dwactlen, NULL);  /* 从串口发送数据*/

delete[] psendbuf;
}
//程序结束调用的函数
void Cserial1Dlg::OnDestroy()
{
    CDialog::OnDestroy();

if (ExitThreadEvent != NULL)
{
  SetEvent(ExitThreadEvent);    /* 通知串口接收线程退出*/
  Sleep(1000);
  CloseHandle(ExitThreadEvent);    /* 关闭接收线程退出事件句柄*/
  ExitThreadEvent = NULL;
}
ClosePort();         /* 关闭串口*/

}

  ……

最新回复

高手! 我刚才看了一下,串口1是被占用了,改成2就行了,谢谢!  详情 回复 发表于 2009-9-8 10:59
点赞 关注

回复
举报

49

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主我觉得刚开始你还是找个例子,慢慢修改。如果人家可以的,到你那里不行,那就是驱动问题,
排除,顺藤摸瓜就可以学到不少东西。
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
应该是CreateFile函数没有执行
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

4
 
沉下去了,没人知道原因吗?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
error=GetLastError();


把 error 打印出来看看。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
程序编译没错,只是在打开串口的时候失败了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
程序不一定错,可能与板子有关,同步异步考虑一下.
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
6410的板子的话 那么他的Createfile参数还是这么设置吗,还是要改啊,打开串口失败,我想问题大概就在这里吧,
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

9
 
1. 赞同 4 楼的意见

2. LZ 确定 COM1: 存在吗? 有没有被占用? 是不是就是 LZ 认定的那个 Connector??

Paul, Chao @ Techware
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
  板子开机的时候我打开调试工具(COM1)能看到板子的信息,那么是不是说COM1是存在的呢,我在这个应用程序上打开EXE的时候,调试工具(COM1)也能识别出板子。
  我打开串口提示是“无法打开端口或端口已打开!请检查是否已被占用”,那么就是
hComm == INVALID_HANDLE_VALUE,但我没用串口做其他的啊,怎么就打不开了。
  谢谢大家,还请大家继续关注!
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 1 楼 gooogleman 的回复:
楼主我觉得刚开始你还是找个例子,慢慢修改。如果人家可以的,到你那里不行,那就是驱动问题,
排除,顺藤摸瓜就可以学到不少东西。

这个我是从2410移过来的,驱动6410已有的,谢谢帮忙看一下!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
引用 8 楼 paul_chao 的回复:
1. 赞同 4 楼的意见

2. LZ 确定 COM1: 存在吗? 有没有被占用? 是不是就是 LZ 认定的那个 Connector??

Paul, Chao @ Techware


高手!
我刚才看了一下,串口1是被占用了,改成2就行了,谢谢!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表