CString csCommName = "\\\\.\\COM1";
m_file.Open(csCommName,CFile::modeReadWrite);//CFile m_file是成员变量
//打开串口以及通讯参数的设置都没有问题
m_file.Write(m_string,m_string.StringLength(m_string));
//写入COM1没问题
char InBuffer[1000];
UINT nActual = 0;
nActual=m_file.Read(InBuffer, sizeof(InBuffer));
//读出时nActual总是零?????
我觉得是从串口读时出问题了,但不知为什么!
m_file.Open(csCommName,CFile::modeReadWrite);//CFile m_file是成员变量
//打开串口以及通讯参数的设置都没有问题
m_file.Write(m_string,m_string.StringLength(m_string));
//写入COM1没问题
char InBuffer[1000];
UINT nActual = 0;
nActual=m_file.Read(InBuffer, sizeof(InBuffer));
//读出时nActual总是零?????
我觉得是从串口读时出问题了,但不知为什么!
HANDLE hCom;
hCom = CreateFile("COM1" , 0 , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
这样就打开了串口COM1,hCom是它的句柄,之后就可以进行读写了:
char buffer[10];
DWORD dwTrueRead = 0;
ReadFile(
hCom,
buffer ,
10,
&dwTrueRead,
NULL
);写与读类似!!
串口已经设置好了,没有问题的。
up者都有分的,这可是我的原则:-)
如果使用你说的这些函数,那么怎么设置串口呢?我开始是这样设置的
CFileException e;
if(Myfile.Open(csCommName,CFile::modeReadWrite,&e)) //打开串口
{
ASSERT( SetupComm(Myfile.m_hFile, 20480, 4096) );
ASSERT( PurgeComm(Myfile.m_hFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) );
DCB MyDCB;
ASSERT( GetCommState(Myfile.m_hFile, &MyDCB) );
MyDCB.BaudRate = CBR_9600;
MyDCB.ByteSize = 8;
MyDCB.Parity = NOPARITY;
MyDCB.StopBits = ONESTOPBIT;
ASSERT( SetCommState(Myfile.m_hFile, &MyDCB) );
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 100;
timeouts.WriteTotalTimeoutConstant = 5000;
ASSERT( SetCommTimeouts(Myfile.m_hFile, &timeouts) );
}
若是这样设置不合适,应该怎样呢?谢谢!
有现成的吗?发我一个
[email protected]
当初我也遇到过类似问题,当我换成COM4时(通过“猫”上网的串口)时,调试成功了(当时没用串口调试助手)。你最好用串口调试助手进行调试。
还有为什么用ASSERT,用“Release”编译时,ASSERT里面的表达式还起作用吗
我的程序:
写入
WriteFile (hcom,// Port handle
m_stringedit,// Pointer to the data to write
m_stringedit.StringLength(m_stringedit), // Number of bytes to write
&dwNumBytesWritten, // Pointer to the number of bytes written
NULL // Must be NULL for Windows CE
);
读出:
char Byte[1000];
ReadFile (hcom, // Port handle
Byte, // Pointer to data to read
dwNumBytesWritten, // Number of bytes to read
&dwNumByteRead, // Pointer to number of bytes read
NULL // Must be NULL for Windows CE
);
现在读完后dwNumByteRead总是零!
你的串口有没有开始接收数据啊(有没有别的数据在向串口传数据)
如果你的串口上空空的什么也没有,你怎么读数据啊,当然都是0啊
串口的DCB参数应该和单片机端的传口参数相同,单片机该了这些参数,PC上就要和他相同。
你的意思是说数据写到串口,然后再像文件一样读出来吗?串口可没这种机制啊,他只是写到单片机,又不保存,你最多能读出缓冲区的一些内容。否则你要是想从单片机读出数据,不是就出现乱伦了吗?
我对这方面是不太清楚,还请讲详细点:
听上面的大师说用CreateFile、WriteFile、ReadFile这些函数,还看MSDN好像就是这样使用。是否应该写入缓存,再从缓存读?我没接触过这个。
这个网站不错。可是我找不到用直接用VC++访问串口的程序,好像都使用Active X
ReadFile也的有文件可读啊,你的串口文件是空的,能读出什么,当串口接收到数据放到缓冲区时,你才能用ReadFile读到数据,缓冲区种没有任何数据,你读什么,而且串口本身又不能保存你写入的文件,
fengge8ylf(第一次真正想有个女朋友) ( ) 信誉:
谢谢你,找了一篇,明天看,要熄灯了!住宿舍真讨厌。想熬夜都不行!
我看MSDN上说的过程就是CreateFile-然后设置-然后ReadFile-然后WriteFile。没说怎么
把数据放到缓冲区阿?
fengge8ylf(第一次真正想有个女朋友) ( ) 信誉:
谢谢你,找了一篇,明天看,要熄灯了!住宿舍真讨厌。想熬夜都不行!
to AthlonxpX86(一滴水) ( ) 信誉:105 2003-03-01 21:29:00 得分:0 我看MSDN上说的过程就是CreateFile-然后设置-然后ReadFile-然后WriteFile。没说怎么
把数据放到缓冲区阿?
用异步通讯方式比较好
一个很好的串口编程示例,没有使用ACTIVEX,完全是WIN32http://www.codeproject.com/useritems/chaiyasit_t.asp#creating
咬牙看了:-( ,不过还是谢谢你!
你跟 fengge8ylf(第一次真正想有个女朋友) 说的是同一个网站。
这么好的东西怎么就我不知道啊?
好东西大家分享:
http://www.gjwtech.com
你只要把龚建伟老师的主页上这一页的代码研究透就可以了。
http://www.gjwtech.com/scomm/sc2serialportclass.htm
这一页的代码可以说是龚建伟老师主页上所有介绍串口编程文章的精华所在了,说夸张点他的所有串口编程文章都是在讲这段代码的原理,你可以下载下来直接用,看一下头文件,非常简单几个函数就高定了,你也可以看他的源代码,我基本看懂了,涉及的多线程技术比较多,但在windows下应该说是必需的。
我用做好的串口线把COM1 和COM2连起来了,串口线没有问题,在别的程序上试过了,痛苦……
我式过了,换成文件是完全可以,改成串口就不行了
写数据WriteFile的地方,请帮忙!谢谢!打开串口:
HANDLE m_hcom;
m_hcom= CreateFile("COM1",// Specify port device
GENERIC_READ | GENERIC_WRITE,// Specify mode that open device.
0, // the devide isn't shared.
NULL, // the object gets a default security.
OPEN_EXISTING, // Specify which action to take on file.
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
if (m_hcom == INVALID_HANDLE_VALUE)
AfxMessageBox("hComm == INVALID_HANDLE_VALUE");设置串口:
COMMTIMEOUTS m_CommTimeouts;
m_CommTimeouts.ReadIntervalTimeout = 1000;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
if (SetCommTimeouts(m_hcom, &m_CommTimeouts))
{
if (GetCommState(m_hcom, &m_dcb))
{
m_dcb.BaudRate=CBR_9600;
m_dcb.ByteSize=8;
m_dcb.StopBits=ONESTOPBIT;
if (!SetCommState(m_hcom, &m_dcb))
AfxMessageBox("SetCommState()");
} else
AfxMessageBox("GetCommState()");}
else
AfxMessageBox("SetCommTimeouts()");
char m_szWriteBuffer[0x1000];
OVERLAPPED m_ov;
memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
strcpy(m_szWriteBuffer,m_string);
m_ov.Offset = 0;
m_ov.OffsetHigh = 0;
BOOL bResult=TRUE;
bResult = WriteFile(m_hcom, // Handle to COMM Port
m_szWriteBuffer,// Pointer to message buffer in calling finction
strlen((char*)m_szWriteBuffer), // Length of message to send
&BytesSent, // Where to store the number of bytes sent
&m_ov); // Overlapped structure
if(!bResult)
AfxMessageBox("WriteFile Failed");
前面运行正确,为什么总是写数据失败?即显示WriteFile Failed?
http://www.gjwtech.com/scomm/sc2serialportclass.htm
这一页上的代码,
如果返回错误,就说明是对的。因为他的代码用了多线程重叠IO,他主页上有这个解释,
m_hcom= CreateFile("COM1",// Specify port device
GENERIC_READ | GENERIC_WRITE,// Specify mode that open device.
0, // the devide isn't shared.
NULL, // the object gets a default security.
OPEN_EXISTING, // Specify which action to take on file.
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//以重叠方式打开串口
NULL);
用了重叠IO后,WriteFile不等执行完就返回一个错误,你需要加入等待串口事件的函数和同步对象等待的函数一判断串口的返回事件,然后处理这些事件。详细解释去龚建伟老师的主页找吧,我不能在这里给你讲课吧 如果你想简单了事就用我说的那个类就可以了,你也可以看他的代码,看完后你就知道怎么回事了 强烈建议转到VC/MFC硬件/系统版,我会把他整理成FAQ的
我把FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED这一项去掉,就可以发送了,但是
慢的很。VC/MFC硬件/系统版相似的问题有很多,不错。
应你要求,过会就转帖
你说的"佩服外国人的编程风格"的那个程序,为什么输出都是乱吗?
比如:我在CEdit1中输入222,com2口就显示"? ? ?"
收到你的信了,正在研究,谢谢先。
还是每位数据都是ASIIC码,还是UNICODE,还有许多问题,比如字符串数组没有初始化,然后就装字符串,这样你永远也装不进去只要你确认你的串口能发数据,那就是你的事,人家的代码只是按2进制发的给你说我也说不清楚,拿来我给你调,我要是调不过去,我装死去,从此不来CSDN了
是要是运行两个对话框,一个打开COM1用来写数据,一个打开COM2用来读数据,就不行了。
请大家谈谈这是为什么?为什么?
fengge8ylf(第一次真正想有个女朋友) ( )
HongHuer(痛苦:我什么都不懂) ( )
demetry(智者橡木) ( ) 信誉:132
给我找了很多技术资料,使我从中学了不少东西,其中
http://www.gjwtech.com
http://www.codeproject.com
我觉得都不错,与我一样有着方面问题的朋友,可以去看看:-)
最后,要谢谢
AthlonxpX86(一滴水) ( )和默默关心我的大哥。
虽然忙,还抽时间帮我调试代码,纠正错误。谢谢!现在结帖。再次感谢,祝愿CSDN上的所有朋友天天快乐!