今天一個學長找我給我看看一個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;
}