aduadu

aduadu

0个粉丝

98

问答

0

专栏

45

资料

aduadu  发布于  2008-05-27 11:09:53
采纳率 0%
98个问答
4383

Windows CE下的串口代码

   
打开串口

hSerial = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(m_hSerial == NULL)
{
 ///L"串口打开失败";
 return;
}

///配置串口

DCB PortDCB;
PortDCB.DCBlength = sizeof(DCB);
// 默认串口参数
GetCommState(hSerial, &PortDCB);
PortDCB.BaudRate = 115200; // baud
PortDCB.ByteSize = 8; // Number of bits/byte, 4-8
PortDCB.Parity = NOPARITY;
PortDCB.StoPBits = ONESTOPBIT;
if (! SetCommState(hSerial, &PortDCB))
{
 ///L"配置串口失败";
 return;
}

////配置超时值

COMMTIMEOUTS CommTimeouts;

GetCommTimeouts(m_hSerial, &CommTimeouts);
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier = 10;
CommTimeouts.ReadTotalTimeoutConstant = 10;
CommTimeouts.WriteTotalTimeoutMultiplier = 50;
CommTimeouts.WriteTotalTimeoutConstant = 100;
if (!SetCommTimeouts(hSerial, &CommTimeouts))
{
 ///L"不能设置超时参数";
 return;
}

二、关闭串口

  关闭串口用关闭句柄函数。

if(hSerial != NULL)
{
 CloseHandle(hSerial);
 hSerial = NULL;
}
向串口发送数据

WriteFile (hSerial, // 句柄
 &Byte, // 数据缓冲区地址
 nByte, // 数据大小
 &dwNumBytes, // 返回发送出去的字节数
 NULL // 不支持重叠
);
读取串口数据
UINT ReadThread(LPVOID pParam) ////接收串口数据线程
{
 HANDLE hPort = *(HANDLE*)pParam;
 BYTE Byte;
 int iCounter = 0;
 DWORD dwBytes;
 char ReceiveBuf[1000]; ///缓冲区的大小

 SetCommMask (hPort, EV_RXCHAR); ///只接收字符
 while (hPort != INVALID_HANDLE_VALUE)
 {
  DWORD dwCommStatus;
  WaitCommEvent(hPort, &dwCommStatus, 0);
  SetCommMask (hPort, EV_RXCHAR); ///重新设置要等待的信号
  //// 接收数据
  do
  {
   ReadFile(hPort, &Byte, 1, &dwBytes, 0);
   if(dwBytes == 1)
   {
    ReceiveBuf[iCounter++] = Byte;
    if(iCounter == 1000)
    {
     ///L"接收缓冲区已满";
     return -1;
    }
   }
  } while (dwBytes == 1);
  if(iCounter == 0) ////没接到数据
  {
   continue;
  }
  //////保存数据
  char* pTmp = new char[iCounter + 1];
  if(pTmp == NULL)
  {
   ///L"内存不足,接收串口数据线程关闭";
   return -1;
  }
  memcpy(pTmp, ReceiveBuf, iCounter);
  pTmp[iCounter] = NULL; ////字符串结尾
  ////////创建新线程处理数据
  AfxBeginThread(ProcessData, pTmp); ////在ProcessData函数中处理数据。别忘了delete[] pTmp;
  iCounter = 0; ////清空计数器
 } ///////end while
 return 0;
}
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区