首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

VxWorks串口例子

VxWorks串口例子

 //****************************************************************************
  //
  // 下面这些函数是使能串口 UART,并从串口发送接收数据,不同的硬件串口,程// 序都是类似的,只要改一下相应的硬件参数即可
  //
  //****************************************************************************
  //****************************************************************************
  //
  // UARTEnable 设置串口UART,并使能
  //
  //****************************************************************************
  long
  UARTEnable(long lPort, long lDataRate, long lDataBits, long lStopBits,
  long lParity, long lEvenParity)
  {
  unsigned char *pucPtr = (unsigned char *)HwBaseAddress; //硬件的基地址
  long lRates[12] = { 115200, 76800, 57600, 38400, 28800, 19200, 14400, 9600,
  4800, 2400, 1200, 110 }; //串口波特率
  long lDivisors[12] = { 1, 2, 3, 5, 7, 11, 15, 23, 47, 95, 191, 2094 };
  long lIdx, lConfig;
  //
  // 赋波特率值
  //
  for(lIdx = 0; lIdx < 12; lIdx++)
  {
  if(lRates[lIdx] == lDataRate)
  {
  break;
  }
  }
  if(lIdx == 12)
  {
  return(0);
  }
  lConfig = lDivisors[lIdx];
  //
  // 设置有效的数据位宽度
  //
  switch(lDataBits)
  {
  case 5:
  {
  lConfig |= HwUartControlDataLength5;
  break;
  }
  case 6:
  {
  lConfig |= HwUartControlDataLength6;
  break;
  }
  case 7:
  {
  lConfig |= HwUartControlDataLength7;
  break;
  }
  case 8:
  {
  lConfig |= HwUartControlDataLength8;
  break;
  }
  default:
  {
  return(0);
  }
  }
  //
  // 设置停止位个数
  //
  if(lStopBits == 2)
  {
  lConfig |= HwUartControlTwoStopBits;
  }
  else if(lStopBits != 1)
  {
  return(0);
  }
  //
  // 设置奇偶位校验
  //
  if(lParity)
  {
  lConfig |= HwUartControlParityEnable;
  //
  // 偶数位
  //
  if(lEvenParity)
  {
  //
  // 改变奇数位为偶数位 (默认是奇数位).
  //
  lConfig |= HwUartControlParityEven;
  }
  }
  //
  // 设置,使能 UART.
  //
  //
  // 关闭 RTS.
  //
  // pucPtr[HwPortB] &= ~HwPortBRTS;
  //
  // 打开 UART.
  //
  *((unsigned long *)(pucPtr + HwControl)) |= HwControlUartEnable;
  //
  // 设置 UART.
  //
  *((unsigned long *)(pucPtr + HwUartControl)) =
  lConfig | HwUartControlFifoEnable;
  }
  //****************************************************************************
  //
  // UARTDisable 关闭 UART.
  //
  //****************************************************************************
  void
  UARTDisable(long lPort)
  {
  unsigned char * volatile pucPtr = (unsigned char *)HwBaseAddress;
  //
  // 如果UART已经关闭,返回
  //
  if(!lPort1Enabled)
  {
  return;
  }
  //
  // 检查传送数据的 FIFO 是否为空,若不为空,循环等待.
  //
  while(*((unsigned long *)(pucPtr + HwStatus)) & HwStatusUartTxBusy)
  {
  }
  //
  // 关闭 UART.
  //
  *((unsigned long *)(pucPtr + HwControl)) &= ~HwControlUartEnable;
  //
  // 标记 UART 为关
  //
  lPort1Enabled = 0;
  }
  }
  //****************************************************************************
  //
  // UARTSendChar 发送一个字符到串口 UART.
  //
  //****************************************************************************
  void
  UARTSendChar(long lPort, char cChar)
  {
  unsigned char * volatile pucPtr = (unsigned char *)HwBaseAddress;
  //
  // 循环等待直到传送数据的UART FIFO 为空.
  //
  while(*((unsigned long *)(pucPtr + HwStatus)) & HwStatusUartTxFifoFull)
  {
  }
  //
  // 写字符到串口 UART.
  //
  pucPtr[HwUartData] = cChar;
  }
  //****************************************************************************
  //
  // UARTReceiveChar 从串口 UART 接收字符
  //
  //****************************************************************************
  char
  UARTReceiveChar(long lPort)
  {
  unsigned char * volatile pucPtr = (unsigned char *)HwBaseAddress;
  //
  // 循环等待直到接收数据的UART FIFO 内有数据
  //
  while(*((unsigned long *)(pucPtr + HwStatus)) &
  HwStatusUartRxFifoEmpty)
  {
  }
  //
  // 从串口 UART 读出数据,并返回
  //
  return(pucPtr[HwUartData]);
  }
  //****************************************************************************
  //
  // UARTCharReady 判断是否在串口有数据等待接收
  //
  //****************************************************************************
  long
  UARTCharReady(long lPort)
  {
  unsigned char * volatile pucPtr = (unsigned char *)HwBaseAddress;
  //
  // 检查是否有数据在UART FIFO 等待
  //
  if(*((unsigned long *)(pucPtr + HwStatus)) & HwStatusUartRxFifoEmpty)
  {
  //
  // 没有数据,返回 0
  //
  return(0);
  }
  //
  // 有数据,返回 1
  //
  return(1);
  }
返回列表