1/Windows
我们首先用串口调试助手进行串口通讯,再使用c语言编程进行通讯。
windows上的串口调试助手我使用的是安信可串口调试助手
http://wiki.ai-thinker.com/tools
在单片机中写好串口通讯的代码,在串口调试助手中对应设置好串口号、波特率等参数,串口在win10下可以通过win+x—设备管理器—端口来查看。当然,最简单的方法是插拔串口,串口调试助手中多出来的那个串口便是单片机的串口号。
stc单片机代码(stc89c52):
#include <reg52.h>
#include <stdio.h>
extern void uart_init(void);
uint16_t a,flag;
int main(void)
{
uart_init();
while(1)
{
if(flag)
{
if(a == 67)
{
P1 = ~P1;//led
}
ES = 0;
SBUF = a;
while(!TI);
TI = 0;
ES = 1;
flag = 0;
}
}
}
void uart_init(void)
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
ES = 1;
}
void ser() interrupt 4
{
RI = 0;
a = SBUF;
flag = 1;
}
成功后,下一步我们就要用代码进行串口通讯了。这里我是在欧阳伟的串口通讯API上进行了修改。
https://github.com/ayowin/WzSerialPort
首先我将send函数的形参buf由const void*改为void *,用来发送变量。
int WzSerialPort::send(void* buf, int len)
接下来我又封装了一个自己的马达控制函数。
void motor_control(int ID, int val)
{
char A[6] = { '0',' ','0','0','0',' ' };
//最后必须有空格,单片机才会认为输入结束。
WzSerialPort w;
A[0] = ID + 48;
A[2] = val / 100 + 48;
A[3] = (val / 10) % 10 + 48;
A[4] = val % 10 + 48;
if (w.open("COM7", 9600, 0, 8, 1))
{
w.send(A, 6);//从A[0]开始,往后读6字节数据
printf("send finished...\n");
}
else
{
printf("open serial port failed...\n");
}
}
2/Linux
和在windows上一样,我们也是先跑通串口调试助手,然后再使用代码。
linux上我使用的串口调试助手叫cutecom(图形化界面),直接使用命令sudo apt-get install cutecom
就可以在ubuntu上安装(支持arm版本,树莓派上也可以使用)。
其余的步骤都和windows上的一样,欧阳伟同样也提供了Linux上的串口通讯API!感谢开源!
值得一提的是,linux上的串口号是/dev开头的,和windows上的COM不一样,注意一下就可以,在程序中要做好相应的修改。