今天一个学长找我给我看看一个ARM板子和串口通信的程序,后来百度了一下感觉挺多人发生这种情况。
单片机和计算机可以进行串口通信。
ARM板子和计算机也可以串口通信。
但是用串口线把单片机和ARM连接一起之后却不能通信了。
大家都知道应该是串口线的问题,需要进行交叉。
那么如果不确定是不是串口线的问题下,其实可以直接用杜邦线把ARM板子上的串口和单片机的板子直接相连。
需要3个杜邦线、3个两端都是针型状的(一头插进杜邦线,一头插进母头),连接分别为GND TXD RXD。
串口有分为公头和母头,5号为GND 2号为接受数据(RXD) 3号为发送数据(TXD)。
公头:
\ 1 2 3 4 5 /
\ 6 7 8 9 /
母头:
\ 5 4 3 2 1 /
\ 9 8 7 6 /
确定公头和母头的5号对连。
2号和3号则有两种方法进行连接,
要么2连接2
要么3连接3
如果试一下一个不行,则可以换成另一种。
最后确实验证可以通过。
当时测试的程序
单片机:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar flag, r;
uchar code table[] = "I get ";
sbit led1 = P2^3;
sbit led2 = P2^4;
sbit led3 = P2^5;
sbit led4 = P2^6;
void delay(uint x)
{
uint i, j;
for(i = x; i > 0; i--)
for(j = 110; j > 0; j--);
}
void init()
{
TMOD = 0x20;
TL1 = 0xfd;
TH1 = 0xfd;
TR1 = 1; //设置定时器1的工作方式、给定初值、并启动。
SM0 = 0;//设置串口工作方式..
SM1 = 1;//为工作方式2..
REN = 1;//允许串口接收数据
ES = 1; //开启串口中断
EA = 1; //开启总中断.
}
void main()
{
uint i;
init();
while(1)
{
if(flag == 1)
{
ES = 0;
for(i = 0; i < 6; i++)
{
SBUF = table[i];
while(!TI);//等待数据是否发送完毕、
//如果发送完毕TI = 1(引发中断/但总中断已关)
TI = 0;
delay(100);
}
SBUF = r;
while(!TI);
TI = 0;
flag = 0;
ES = 1;
}
}
}
void ser()interrupt 4
{
led4 = 0;
led1 = led2 = led3 = 1;
RI = 0; //关闭接收中断标志位..
flag = 1; //标志已经接收到数据
r = SBUF; //把数据存放r变量中(8位)
if(r == '3')
{
led1 = 0;
led2 = 0;
led3 = 0;
}
if(r == '2')
{
led1 = 0;
led2 = 0;
}
if(r == '1')
{
led1 = 0;
}
}
ARM板上:
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<errno.h>
#include<termios.h>
#include<sys/types.h>
#include<sys/unistd.h>
#include<unistd.h>
#include<string.h>
int main()
{
int fd;
struct termios new_cfg, old_cfg;
char buff[20];
char a;
char *name = "/dev/s3c2410_serial0";
fd = open(name, O_RDWR|O_NDELAY);
if(fd < 0)
{
perror("open");
exit(-1);
}
else
{
printf("open s3c2440_serial0 success\n");
}
if(tcgetattr(fd, &old_cfg) != 0)
{
perror("tcgetattr");
exit(-1);
}
new_cfg = old_cfg;
cfmakeraw(&new_cfg);
new_cfg.c_cflag &= ~CSIZE;
cfsetispeed(&new_cfg, B9600);
new_cfg.c_cflag |= CS8;
new_cfg.c_cflag &= ~PARENB;
new_cfg.c_cflag &= ~CSTOPB;
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &new_cfg);
a = '3';
do
{
printf("Input some words(enter 'quit' to exit):");
// memset(buff, 0, 20);
buff[0] = a;
a--;
if(a == '0')
{
a = '3';
}
buff[1] = '\0';
write(fd, buff, strlen(buff));
sleep(1);
}while(strncmp(buff, "quit", 4));
close(fd);
return 0;
}