arm板子和单片机进行串口通讯

今天一个学长找我给我看看一个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;
}

发布了21 篇原创文章 · 获赞 1 · 访问量 6097

猜你喜欢

转载自blog.csdn.net/darling54454/article/details/27236449