串口与计算机通信,关于arduino通过USB串口与计算机通信的一个奇怪的问题

我的arduino是Mega2560。我在计算机上用C++,用winAPI串口函数编了一个程序,用来和Mega2560通信。通信通过USB内的虚拟串口进行。这个串口在我的计算机上显示是com5。

调试过程中发现,上位机程序和单片机是可以通信,但是有一个前提,就是每次单片机上电以后,我必须在计算机上启动arduino IDE里边的串口监视器,然后再关闭它,然后我的上位机程序才能够和单片机通信。如果我不事先启动串口监视器,看起来上位机程序可以向单片机发数据(2560的RX灯会闪),但是单片机不向计算机发送数据(tx灯不闪,计算机程序也等不到数据)。不知是否有前辈曾经有过类似的经历?这一般是怎么回事?

附上计算机上的相关源码:

HANDLE hCom;

hCom=CreateFile(Edit3 -> Text.c_str(),

GENERIC_READ|GENERIC_WRITE,

0,

NULL,

OPEN_EXISTING,

0,

NULL

);

if(hCom==(HANDLE)-1)

{

Edit3 -> Text = "打开串口失败";

return;

}

SetupComm(hCom,64,64);

COMMTIMEOUTS TimeOuts;

TimeOuts.ReadIntervalTimeout=2;

TimeOuts.ReadTotalTimeoutMultiplier=50;

TimeOuts.ReadTotalTimeoutConstant=100;

TimeOuts.WriteTotalTimeoutMultiplier=500;

TimeOuts.WriteTotalTimeoutConstant=1000;

SetCommTimeouts(hCom,&TimeOuts);

DCB dcb;

GetCommState(hCom,&dcb);

dcb.BaudRate = CBR_115200;

dcb.ByteSize = 8;

dcb.Parity = NOPARITY;

dcb.StopBits = ONESTOPBIT;

dcb.fParity = FALSE;

SetCommState(hCom,&dcb);

PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);

Sleep(1000);  //wait at least900ms to wait MCU to ready

complex Ring[200];

int R,I,tmp1,tmp2,tmp3,tmp4;

char lpOutBuffer[]="1200 1328 0 7 0 r";

char str[64];

//  int i=0;

for(int i=0;i<5;i++)

{

DWORD dwBytesWrite=20;

COMSTAT ComStat;

DWORD dwErrorFlags;

ClearCommError(hCom,&dwErrorFlags,&ComStat);

WriteFile(hCom,lpOutBuffer,dwBytesWrite,&dwBytesWrite,NULL);

Sleep(50);

DWORD wCount;

ReadFile(hCom,str,64,&wCount,NULL);

Label6 -> Caption = str;

sscanf(str,"%d %d %d %d %d %d",&R,&I,&tmp1,&tmp2,&tmp3,&tmp4);

Ring[i].R=(float)R/16.0;

Ring[i].I=(float)I/16.0;

}

CloseHandle(hCom); //handle to object to close

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值