Archive for 八月, 2009
mingw调用WINAPI实现串口操作
mingw调用WINAPI好像还是比较简单滴
先用个小例子看看mingw调用WINAPI是否正常
#include? <windows.h>
int main()
{
MessageBox (NULL,”text”, “title”, MB_OK);
return 0;
}
编译之: gcc mian.c
如果能弹出消息窗口说明正常
如不能 则可能是mingw没有安装WINAPI包
接下来就是开始要操作串口了
打开串口设备是CreateFile()
示例:
HANDLE hCom;
hCom = CreateFile("com1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
如果CreateFile()返回失败
则可以用GetLastError()获取失败代码
if ( hCom == (HANDLE)0xFFFFFFFF )
{
return GetLastError();
}
else
{
return 0;
}
GetLastError()返回的错误代码一般是: 2,串口不存在 5,串口已被占用
然后就可以设置串口了,见很多人常问,说SetCommState()返回失败
原理是参数非法
我们可以先用GetCommState()获取当前串口参数
再修改我们需要调整的参数,然后再加写之,这样就可以了
DCB????????? dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate = baudrate;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = 0;
dcb.fBinary = TRUE;
dcb.fParity = FALSE;
SetCommState(hCom,&dcb)
另外我们常用的是9600,8,N,1
但这里却StopBits只能设置成0 不知道为什么
其实我们可以检测设置是否成功
然后再设置成功,然后再清空缓存区和设置超时
if ( SetCommState(hCom,&dcb) != TRUE )
{
return FALSE;
}
else
{
SetupComm(hCom,1024,1024);
PurgeComm(hCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
GetCommTimeouts(hCom,&timeout);
timeout.ReadIntervalTimeout = 1000;
timeout.ReadTotalTimeoutMultiplier = 500;
timeout.ReadTotalTimeoutConstant = 5000;
timeout.WriteTotalTimeoutMultiplier = 500;
timeout.WriteTotalTimeoutConstant = 2000;
SetCommTimeouts(hCom,&timeout);
return TRUE;
}
下面就可以发送和接收数据了
数据发送和接收都没什么难度了
参考文章资料:
使用Win32API实现Windows下异步串口通讯
深入浅出VC++串口编程之基于Win32 API
STM32用SWD4线模式的时候要选择软件复位
STM32用SWD4线模式的时候要选择软件复位(默认为硬件RESET)
不然烧写FLASH会失败
有空学习下高数
数学方面的知识都忘光了快..
不对,是我根本就没学过高数
要慢慢补起来
第一步 复习初中的知识
第一节 函数的主要特征: 奇偶性 周期性 单调性 单值性