11 个解决方案
#1
说详细点
#2
没说清楚吗?
自己用WinAPI编写的串口通讯程序,在主板上自带串口的机器上调试通过,收发都正常.
然后将该程序用于一台没有串口的笔记本电脑,使用USB转串口线的串口,发生无法正常收发数据的现象.但在该笔记本电脑上用"串口调试器"调试,收发都正常.
自己用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;
}
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;
注释的和没注释的有些区别,具体我也忘了,你可以跟踪一下串口调试程序的那几个参数都是什么,我想和你的程序有些不同,改成一样的就应该可以了
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转串口线的串口,发生无法正常收发数据的现象.但在该笔记本电脑上用"串口调试器"调试,收发都正常.
自己用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;
}
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;
注释的和没注释的有些区别,具体我也忘了,你可以跟踪一下串口调试程序的那几个参数都是什么,我想和你的程序有些不同,改成一样的就应该可以了
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
可能需要硬件握手。
以前我也碰到过,接主板上的串口就没问题了。
以前我也碰到过,接主板上的串口就没问题了。