基于OK6410的串口数据收发

  1. ***************************  
  2.  *基于OK6410的串口程序  
  3.  *2012.12.4  
  4.  *孙旭  
  5.  ***************************/  
  6.   
  7. #include<stdio.h>  
  8. #include<stdlib.h>  
  9. #include<string.h>  
  10. #include<sys/types.h>  
  11. #include<sys/stat.h>  
  12. #include<fcntl.h>  
  13. #include<unistd.h>  
  14. #include<termios.h>  
  15. #include<string.h>  
  16.   
  17. /*串口设置,"串口,波特率,数据位,奇偶校验,停止位"*/  
  18. int set_Baudrate(int fd,int nSpeed, int nBits, char nEvent, int nStop)  
  19. {  
  20.  struct termios newtio,oldtio;  
  21.   
  22.  //保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息  
  23.  if(tcgetattr(fd,&oldtio) != 0)  
  24.  {   
  25.   perror("SetupSerial 1");  
  26.   return -1;  
  27.  }  
  28.  bzero( &newtio, sizeof( newtio ) );  
  29.   
  30.  //设置字符大小  
  31.  newtio.c_cflag  |=  CLOCAL | CREAD;  
  32.  newtio.c_cflag &= ~CSIZE;  
  33.   
  34.  //数据位的设置  
  35.  switch( nBits )  
  36.  {  
  37.  case 7:  
  38.   newtio.c_cflag |= CS7;  
  39.   break;  
  40.  case 8:  
  41.   newtio.c_cflag |= CS8;  
  42.   break;  
  43.  }  
  44.   
  45.  //奇偶校验的设置  
  46.  switch( nEvent )  
  47.  {  
  48.  case 'O':      //奇数  
  49.   newtio.c_cflag |= PARENB;  
  50.   newtio.c_cflag |= PARODD;  
  51.   newtio.c_iflag |= (INPCK | ISTRIP);  
  52.   break;  
  53.  case 'E':     //偶数  
  54.   newtio.c_iflag |= (INPCK | ISTRIP);  
  55.   newtio.c_cflag |= PARENB;  
  56.   newtio.c_cflag &= ~PARODD;  
  57.   break;  
  58.  case 'N':     //无奇偶校验位  
  59.   newtio.c_cflag &= ~PARENB;  
  60.   break;  
  61.  }  
  62.   
  63.  //波特率的设置  
  64.  switch( nSpeed )  
  65.  {  
  66.  case 2400:  
  67.   cfsetispeed(&newtio, B2400);  
  68.   cfsetospeed(&newtio, B2400);  
  69.   break;  
  70.  case 4800:  
  71.   cfsetispeed(&newtio, B4800);  
  72.   cfsetospeed(&newtio, B4800);  
  73.   break;  
  74.  case 9600:  
  75.   cfsetispeed(&newtio, B9600);  
  76.   cfsetospeed(&newtio, B9600);  
  77.   break;  
  78.  case 115200:  
  79.   cfsetispeed(&newtio, B115200);  
  80.   cfsetospeed(&newtio, B115200);  
  81.   break;  
  82.  case 460800:  
  83.   cfsetispeed(&newtio, B460800);  
  84.   cfsetospeed(&newtio, B460800);  
  85.   break;  
  86.  default:  
  87.   cfsetispeed(&newtio, B9600);  
  88.   cfsetospeed(&newtio, B9600);  
  89.   break;  
  90.  }  
  91.   
  92.  //停止位的设置  
  93.  if( nStop == 1 )  
  94.   newtio.c_cflag &=  ~CSTOPB;  
  95.  else if ( nStop == 2 )  
  96.   newtio.c_cflag |=  CSTOPB;  
  97.   
  98.  //设置等待时间和最小接收字符  
  99.  newtio.c_cc[VTIME]  = 0;  
  100.  newtio.c_cc[VMIN] = 0;  
  101.   
  102.  //处理为接收字符  
  103.  tcflush(fd,TCIFLUSH);  
  104.   
  105.  //激活新配置  
  106.  if((tcsetattr(fd,TCSANOW,&newtio))!=0)  
  107.  {  
  108.   perror("com set error");  
  109.   return -1;  
  110.  }  
  111.   
  112.  return 0;  
  113. }  
  114.   
  115. /*数据解析*/  
  116. int analysis_data(char buf[100])  
  117. {  
  118.  printf("recv data %s \n",buf);  
  119. }  
  120.   
  121. /*波特率为115200串口0*/  
  122. int serial_port0(void)  
  123. {   
  124.  int fd_port;  
  125.  int return_value=0;  
  126.  int length_data=0;  
  127.  char buffer[100];    //从串口读取数据的buffer  
  128.  memset(buf,0,sizeof(buf));  
  129.   
  130.  //打开串口0  
  131.  fd_port = open("/dev/ttySAC0",O_RDWR);  
  132.  if(-1 == fd_port)  
  133.  {  
  134.   exit(1);  
  135.  }  
  136.     
  137.  //串口,波特率,数据位,奇偶校验,停止位  
  138.  return_value = set_Baudrate(fd_port,115200,8,'N',1);  
  139.  if(-1 == return_value)  
  140.  {  
  141.   exit(1);  
  142.  }  
  143.   
  144.  //接收串口0的数据  
  145.  while(1)  
  146.  {  
  147.   length_data = read(fd_port,buf,1);  //数据的发送使用write(fd_port,buf,1); buf为要发送的字符串  
  148.   if(-1 == length_data)  
  149.   {  
  150.    exit(1);  
  151.   }  
  152.     
  153.   if(0 > analysis_data(buf))  
  154.    return -1;  
  155.   
  156.   memset(buf,0,100);  
  157.  }  
  158.   
  159.  close(fd_port);  
  160.  return 1;  
  161. }  
  162.   
  163. /*波特率为4800串口1*/  
  164. int serial_port1(void)  
  165. {   
  166.  int fd_port;  
  167.  int return_value=0;  
  168.  int length_data=0;  
  169.  char buffer[100];    //从串口读取数据的buffer  
  170.  memset(buf,0,sizeof(buf));  
  171.   
  172.  //打开串口1  
  173.  fd_port = open("/dev/ttySAC1",O_RDWR);  
  174.  if(-1 == fd_port)  
  175.  {  
  176.   return -1;  
  177.  }  
  178.     
  179.  //串口,波特率,数据位,奇偶校验,停止位  
  180.  return_value = set_Baudrate(fd_port,4800,8,'N',1);  
  181.  if(-1 == return_value)  
  182.  {  
  183.   return -1;  
  184.  }  
  185.   
  186.  //接收串口1的数据  
  187.  while(1)  
  188.  {  
  189.   length_data = read(fd_port,buf,1); //数据的发送使用write(fd_port,buf,1);  
  190.   if(-1 == length_data)  
  191.   {  
  192.    exit(1);  
  193.   }  
  194.     
  195.   if(0 > analysis_data(buf))  
  196.    return -1;  
  197.   
  198.   memset(buf,0,100);  
  199.  }  
  200.  close(fd_port);  
  201.  return 1;  
  202. }  
  203.   
  204. /*主函数*/  
  205. int main(void)  
  206. {  
  207.  if(0 > serial_port0())  
  208.  {  
  209.   exit(1);  
  210.  }  
  211.   
  212.  if(0 > serial_port1())  
  213.  {  
  214.   exit(1);  
  215.  }  
  216.  return 0;  
  217. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于STM32CubeIDE的UART串口收发数据的示例代码: ```c #include "main.h" #include "stm32f4xx_hal.h" UART_HandleTypeDef huart2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); uint8_t txData[] = "Hello World!\r\n"; HAL_UART_Transmit(&huart2, txData, sizeof(txData), HAL_MAX_DELAY); uint8_t rxData[10]; HAL_UART_Receive(&huart2, rxData, sizeof(rxData), HAL_MAX_DELAY); HAL_UART_Transmit(&huart2, rxData, sizeof(rxData), HAL_MAX_DELAY); while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 84; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } static void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 这段代码初始化了USART2串口,并通过`HAL_UART_Transmit()`函数发送一条"Hello World!"的消息,接着通过`HAL_UART_Receive()`函数接收10个字节的数据,并再次通过`HAL_UART_Transmit()`函数将接收到的数据发送回去。你可以通过修改`txData`和`rxData`数组的内容来发送和接收其他数据。 在使用此代码之前,请确保你已经正确配置了STM32的时钟和GPIO引脚。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值