用C语言实现串口通讯程序

1. 首先安装虚拟串口vspd软件,用于创建虚拟串口进行互联调试

2.打开vspd软件,选择COM1和COM4,点击Add pair,把COM1和COM4互联

3.打开虚拟串口助手,设置串口号为COM1,波特率为19200,其他设置使用默认值,点击连接

4.用C语言编写串口调试代码,使用COM4


 
typedef struct {
 HANDLE hCom;
 uint32_t baudrate;
 uint32_t bytesize;
 char parity;
 uint32_t stopbit;
}rs232_device;
int set_opt(HANDLE hFile, int nSpeed, int nBits, char nEvent, int nStop)
{
 DCB dcb;
 COMMTIMEOUTS timeouts;
//set input buf and output buf
 SetupComm(hFile, 512, 512);
//set read timeout
 timeouts.ReadIntervalTimeout = 1000;
 timeouts.ReadTotalTimeoutMultiplier = 500;
 timeouts.ReadTotalTimeoutConstant = 5000;
//set write timeout
 timeouts.WriteTotalTimeoutMultiplier = 0;
 timeouts.WriteTotalTimeoutConstant = 2000;
 SetCommTimeouts(hFile, &timeouts);
//store current setting
    if (0 == GetCommState(hFile, &dcb)){
        return -1;
    }
//set BaudRate
 switch(nSpeed){
  case 2400:
   dcb.BaudRate = CBR_2400;
   break;
  case 4800:
   dcb.BaudRate = CBR_4800;
   break;
  case 115200:
   dcb.BaudRate = CBR_115200;
   break;
  default:
   dcb.BaudRate = CBR_9600;
   break;
 }
//set ByteSize
 switch(nBits){
  case 7:
   dcb.ByteSize = 7;
   break;
  case 8:
   dcb.ByteSize = 8;
   break;
  default:
   dcb.ByteSize = 8;
   break;
 }
//set Parity
 switch(nEvent){
  case 'N':
   dcb.Parity = NOPARITY;
   break;
  case 'O':
   dcb.Parity = ODDPARITY;
   break;
  case 'E':
   dcb.Parity = EVENPARITY;
   break;
 }
//set StopBit
 switch(nStop){
  case 1:
   dcb.StopBits = ONESTOPBIT;
   break;
  case 2:
   dcb.StopBits = TWOSTOPBITS;
   break;
 }
 if(0 == SetCommState(hFile, &dcb)){
  return -1;
 }
    return 0;
}
 rs232_device rs232_dev;
 rs232_dev.baudrate = 119200;
 rs232_dev.bytesize = 8;
 rs232_dev.parity = 'N'; 
 rs232_dev.stopbit = 1;
 //打开串口4
 rs232_dev.hCom = CreateFile("COM4",GENERIC_READ |GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);
 if (rs232_dev.hCom !=INVALID_HANDLE_VALUE){
  printf("Open COM4 OK!\n");
 }else 
  printf("Open COM4 Fail!\n");
 //通讯设置
 if(-1 == set_opt(rs232_dev.hCom,
     rs232_dev.baudrate,
     rs232_dev.bytesize,
     rs232_dev.parity,
     rs232_dev.stopbit))
 {
  if(INVALID_HANDLE_VALUE != rs232_dev.hCom)
   CloseHandle(rs232_dev.hCom); 
 }
 unsigned char readBuf[1024] = {0};
 char writeBuf[1024] = "Hello Ketty!";
 int count = 100;
 DWORD readsize = 0;
 DWORD writesize = 0;
 int i;
 while(1){
  if(INVALID_HANDLE_VALUE != rs232_dev.hCom){
   printf("Start Read!\n");
   //串口读操作
   ReadFile(rs232_dev.hCom, readBuf, count, &readsize, NULL);
   printf("Read Buf=");
   for(i=0;i<readsize;i++)
    printf("%x ", readBuf[i]);
   printf("\n");
  }
  //串口写操作
  WriteFile(rs232_dev.hCom, writeBuf, count, &writesize, NULL);
 }
 

  • 11
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值