串口通讯的软件设计解决方法

串口通讯的软件设计


问题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”