串口通讯的软件设计解决方法
串口通讯的软件设计
问题1:
我用API函数写一个自己的串口类,利用CreateFile(),ReadFlie()WriteFile()等函数来完成通讯过程。PC(发送)-> MCU(接收),然后,MCU(发送)-> PC(接收);在主界面的控制下循环这个过程。在这种情况下是否要用到线程,如果不用应怎样实现,如果需要,如何实现。
问题2:
PC传输时发送和接收的数据都是一个字符的二进制,如0011 1111。在发送时应该表示成ASCII的字符值。发送-> max232-> 单片机(SBUF)时,SBUF=0x3F?
另PC在接收单片机发来的数据,并保存在变量buf中,这时如何对这个二进制进行位处理,比如判断其那一位的的值为1/0。
------解决方案--------------------
1、看你用什么方式了,如果是阻塞模式通信的话,最好建立一个线程来负责通信;
2、VC++有位处理功能,你可以移位、求反等等。
------解决方案--------------------
1:看你具体做什么应用了,如果通讯协议是一问一答的话就不需要多线程了。
2:你可以把你的数据放在一个 Buff中,直接调用WriteFile这个函数就可以了,至于位处理你可以看看参考书。
------解决方案--------------------
#define MASK_BIT7 0X80
#define MASK_BIT6 0X40
#define MASK_BIT5 0X20
#define MASK_BIT4 0X10
#define MASK_BIT3 0X08
#define MASK_BIT2 0X04
#define MASK_BIT1 0X02
#define MASK_BIT0 0X01
//
BYTE bRet=ReceiveFrmPort();
if( MASK_BIT0 & bRet)
{
// bit 0 = 1, do sth.
}
------解决方案--------------------
please refer to the online resources for programming serial port
for this bit-flag mask like 0011 0001,
you define in advance its spec. such as MASK_CONFIG1 0X31
------解决方案--------------------
如果是只有八位,你可以一位一位的判断,如果多了可以做个循环。如。
bRet=0011 0001
for (int i=0;i <8)
{
if ((bRet> > i & 0X01)==1)
printf( " 第%d是1 ",i+1);
}
等等。
当然你也可以用一个CString类。把bRet的二进制转化为CSting , 然后再找其中有几个“1”
问题1:
我用API函数写一个自己的串口类,利用CreateFile(),ReadFlie()WriteFile()等函数来完成通讯过程。PC(发送)-> MCU(接收),然后,MCU(发送)-> PC(接收);在主界面的控制下循环这个过程。在这种情况下是否要用到线程,如果不用应怎样实现,如果需要,如何实现。
问题2:
PC传输时发送和接收的数据都是一个字符的二进制,如0011 1111。在发送时应该表示成ASCII的字符值。发送-> max232-> 单片机(SBUF)时,SBUF=0x3F?
另PC在接收单片机发来的数据,并保存在变量buf中,这时如何对这个二进制进行位处理,比如判断其那一位的的值为1/0。
------解决方案--------------------
1、看你用什么方式了,如果是阻塞模式通信的话,最好建立一个线程来负责通信;
2、VC++有位处理功能,你可以移位、求反等等。
------解决方案--------------------
1:看你具体做什么应用了,如果通讯协议是一问一答的话就不需要多线程了。
2:你可以把你的数据放在一个 Buff中,直接调用WriteFile这个函数就可以了,至于位处理你可以看看参考书。
------解决方案--------------------
#define MASK_BIT7 0X80
#define MASK_BIT6 0X40
#define MASK_BIT5 0X20
#define MASK_BIT4 0X10
#define MASK_BIT3 0X08
#define MASK_BIT2 0X04
#define MASK_BIT1 0X02
#define MASK_BIT0 0X01
//
BYTE bRet=ReceiveFrmPort();
if( MASK_BIT0 & bRet)
{
// bit 0 = 1, do sth.
}
------解决方案--------------------
please refer to the online resources for programming serial port
for this bit-flag mask like 0011 0001,
you define in advance its spec. such as MASK_CONFIG1 0X31
------解决方案--------------------
如果是只有八位,你可以一位一位的判断,如果多了可以做个循环。如。
bRet=0011 0001
for (int i=0;i <8)
{
if ((bRet> > i & 0X01)==1)
printf( " 第%d是1 ",i+1);
}
等等。
当然你也可以用一个CString类。把bRet的二进制转化为CSting , 然后再找其中有几个“1”