关于USB转串口线,串口编程问题?

时间:2022-08-12 16:12:15
编写了一个串口程序(用WinAPI编写),在主板上自带串口通过,但使用关于USB转串口线则无法发送接收数据,而用串口调试器则正常,说明可能是我的串口程序有问题,或某些参数设错.请高手指点!

11 个解决方案

#1


说详细点

#2


没说清楚吗?
    自己用WinAPI编写的串口通讯程序,在主板上自带串口的机器上调试通过,收发都正常.
然后将该程序用于一台没有串口的笔记本电脑,使用USB转串口线的串口,发生无法正常收发数据的现象.但在该笔记本电脑上用"串口调试器"调试,收发都正常.

#3


你的程序有问题。。。

#4


我是说把你大概觉的出问题的代码贴出来,要不然我们谁知道?(包括串口调试器的参数设置)

#5


所有代码太长,一下是有关参数设置代码.出现的问题是程序运行正常,但对方收不到数据.

void CComm::SetCommInfoToDCB(LPCOMMINFO lpCommInfo,DCB *pdcb) //!
{
pdcb->BaudRate =BAUDRATE(lpCommInfo);
pdcb->ByteSize =BYTESIZE(lpCommInfo);
pdcb->StopBits =STOPBITS(lpCommInfo);
pdcb->Parity =PARITY(lpCommInfo);

BYTE  bSet ;
bSet = (BYTE) ((FLOWCTRL(lpCommInfo) & FC_DTRDSR) != 0) ;
pdcb->fOutxDsrFlow = bSet ;
if (bSet)
pdcb->fDtrControl = DTR_CONTROL_HANDSHAKE ;
else
pdcb->fDtrControl = DTR_CONTROL_ENABLE ;

bSet = (BYTE) ((FLOWCTRL(lpCommInfo) & FC_RTSCTS) != 0) ;
pdcb->fOutxCtsFlow = bSet ;
if (bSet)
pdcb->fRtsControl = RTS_CONTROL_HANDSHAKE ;
else
pdcb->fRtsControl = RTS_CONTROL_TOGGLE ;

bSet = (BYTE) ((FLOWCTRL(lpCommInfo) & FC_XONXOFF) != 0) ;
pdcb->fInX = pdcb->fOutX = bSet ;

pdcb->XonLim =128;
pdcb->XoffLim =128;
}

#6


http://community.csdn.net/Expert/topic/2850/2850150.xml?temp=.5826532

#7


关于USB转串口线,串口编程问题在“硬件/嵌入开发 其他硬件开发问题”中也有讨论,虽然揭贴,但没有给出结论。请帮忙分析!

#8


我公司好象以前有人用过,经过测试,估计是USB转串口的时候,
硬件设备丢失某些数据的最高位的问题。
没有证实,仅供参考。

#9


因为用"串口调试器",用转接线在一台机器上调试却能正常收发(USB-COM3<->COM1),而我的程序却不能,所以怀疑是程序问题。但如果是不用(USB-COM3),而用(COM1<->COM2),我的程序却能正常收发。很奇怪的问题。(连线全为三线制)

#10


SetCommState中设置的DCB你改改试试,我也碰见过一次,改了就好了
DCB  dcb;
   BOOL fsuccess;
   
   fsuccess = GetCommState(idComDev, &dcb);
   if (!fsuccess) return 0;
   
   dcb.BaudRate =baud_rate;
   dcb.ByteSize =8; //number of bits/byte, 4-8 
   dcb.Parity =NOPARITY;
   dcb.StopBits =ONESTOPBIT;
   dcb.EvtChar=0x02;
   /*
   dcb.fOutxCtsFlow = 1;
   dcb.fDtrControl = 1;
   dcb.fRtsControl = 2;
   dcb.EofChar = 0;
   */
   dcb.fOutxCtsFlow = 0;
   dcb.fDtrControl = 0;
   dcb.fRtsControl = 2;
   dcb.EofChar = 0;
   //dcb.fNull=TRUE;

   fsuccess=SetCommState(idComDev, &dcb);
   if (!fsuccess) return 0;

   return 1;
注释的和没注释的有些区别,具体我也忘了,你可以跟踪一下串口调试程序的那几个参数都是什么,我想和你的程序有些不同,改成一样的就应该可以了

#11


可能需要硬件握手。
以前我也碰到过,接主板上的串口就没问题了。

#1


说详细点

#2


没说清楚吗?
    自己用WinAPI编写的串口通讯程序,在主板上自带串口的机器上调试通过,收发都正常.
然后将该程序用于一台没有串口的笔记本电脑,使用USB转串口线的串口,发生无法正常收发数据的现象.但在该笔记本电脑上用"串口调试器"调试,收发都正常.

#3


你的程序有问题。。。

#4


我是说把你大概觉的出问题的代码贴出来,要不然我们谁知道?(包括串口调试器的参数设置)

#5


所有代码太长,一下是有关参数设置代码.出现的问题是程序运行正常,但对方收不到数据.

void CComm::SetCommInfoToDCB(LPCOMMINFO lpCommInfo,DCB *pdcb) //!
{
pdcb->BaudRate =BAUDRATE(lpCommInfo);
pdcb->ByteSize =BYTESIZE(lpCommInfo);
pdcb->StopBits =STOPBITS(lpCommInfo);
pdcb->Parity =PARITY(lpCommInfo);

BYTE  bSet ;
bSet = (BYTE) ((FLOWCTRL(lpCommInfo) & FC_DTRDSR) != 0) ;
pdcb->fOutxDsrFlow = bSet ;
if (bSet)
pdcb->fDtrControl = DTR_CONTROL_HANDSHAKE ;
else
pdcb->fDtrControl = DTR_CONTROL_ENABLE ;

bSet = (BYTE) ((FLOWCTRL(lpCommInfo) & FC_RTSCTS) != 0) ;
pdcb->fOutxCtsFlow = bSet ;
if (bSet)
pdcb->fRtsControl = RTS_CONTROL_HANDSHAKE ;
else
pdcb->fRtsControl = RTS_CONTROL_TOGGLE ;

bSet = (BYTE) ((FLOWCTRL(lpCommInfo) & FC_XONXOFF) != 0) ;
pdcb->fInX = pdcb->fOutX = bSet ;

pdcb->XonLim =128;
pdcb->XoffLim =128;
}

#6


http://community.csdn.net/Expert/topic/2850/2850150.xml?temp=.5826532

#7


关于USB转串口线,串口编程问题在“硬件/嵌入开发 其他硬件开发问题”中也有讨论,虽然揭贴,但没有给出结论。请帮忙分析!

#8


我公司好象以前有人用过,经过测试,估计是USB转串口的时候,
硬件设备丢失某些数据的最高位的问题。
没有证实,仅供参考。

#9


因为用"串口调试器",用转接线在一台机器上调试却能正常收发(USB-COM3<->COM1),而我的程序却不能,所以怀疑是程序问题。但如果是不用(USB-COM3),而用(COM1<->COM2),我的程序却能正常收发。很奇怪的问题。(连线全为三线制)

#10


SetCommState中设置的DCB你改改试试,我也碰见过一次,改了就好了
DCB  dcb;
   BOOL fsuccess;
   
   fsuccess = GetCommState(idComDev, &dcb);
   if (!fsuccess) return 0;
   
   dcb.BaudRate =baud_rate;
   dcb.ByteSize =8; //number of bits/byte, 4-8 
   dcb.Parity =NOPARITY;
   dcb.StopBits =ONESTOPBIT;
   dcb.EvtChar=0x02;
   /*
   dcb.fOutxCtsFlow = 1;
   dcb.fDtrControl = 1;
   dcb.fRtsControl = 2;
   dcb.EofChar = 0;
   */
   dcb.fOutxCtsFlow = 0;
   dcb.fDtrControl = 0;
   dcb.fRtsControl = 2;
   dcb.EofChar = 0;
   //dcb.fNull=TRUE;

   fsuccess=SetCommState(idComDev, &dcb);
   if (!fsuccess) return 0;

   return 1;
注释的和没注释的有些区别,具体我也忘了,你可以跟踪一下串口调试程序的那几个参数都是什么,我想和你的程序有些不同,改成一样的就应该可以了

#11


可能需要硬件握手。
以前我也碰到过,接主板上的串口就没问题了。