rs485多路串口通信 。。

问题描述

rs485多路串口通信 。。 1C
DM368开发板和一个单片机板通过RS485串口通信。
DM368开发板同时发送一组数据给单片机板和云台比如:aa 55 05 00 33 44 14 90 00
单片机板接收后返回另一组数据给DM368开发板比如:AA 55 16 00 11 22 33 44 00 00 10 00 32 47 42 47 D2 01

这个程序改怎么写?
PS: RS485为半双工 只能读或者只能写。

附上:我已写程序。哪里不对?

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define GIO_RS485_CTRL 51
#define URAT0_RXD 19
#define URAT0_TXD 18
#define RS485_DEVICE_NAME ""/dev/ttyS1""

typedef struct {
int pin_idx;
int pin_dir;
int pin_sta;
} davinci_gio_arg;

typedef enum {
AT91PIO_DIR_OUT = 0
AT91PIO_DIR_INP
} davinci_gio_dir;

#define IOCTL_PIO_SETDIR _IOW('Q' 0x01 int) //Set pio direct
#define IOCTL_PIO_GETDIR _IOR('Q' 0x02 int) //Get pio direct
#define IOCTL_PIO_SETSTA _IOW('Q' 0x03 int) //Set pio status
#define IOCTL_PIO_GETSTA _IOR('Q' 0x04 int) //Get pio status
//IOCTL for FIQ
#define IOCTL_FIQ_SETIRQ _IOW('Q' 0x05 int) //Set fiq handle

#define LEN 16
#define DEV_PIO_LED ""/dev/pio""
#define PIO_NUM 47

int set_com_config(int fdint baud_rateint data_bitschar parityint stop_bits){
struct termios new_cfgold_cfg;
int speed;

/*保存并测试现有的串口参数设置*/if(tcgetattr(fd&old_cfg)!=0){    perror(""tcgetattr"")exit (-1);}/*设置字符大小*/new_cfg = old_cfg;cfmakeraw(&new_cfg);new_cfg.c_cflag &= ~CSIZE;/**/switch(baud_rate){    case 2400:    {        speed = B2400;    }    break;    case 4800:    {        speed = B4800;    }    break;    case 9600:    {        speed = B9600;    }    break;    case 19200:    {        speed = B19200;    }    break;    case 38400:    {        speed = B38400;    }    break;    case 115200:    {        speed = B115200;    }    break;}cfsetispeed(&new_cfgspeed);cfsetospeed(&new_cfgspeed);/*停止位*/switch(data_bits){    case 7:    {        new_cfg.c_cflag |=CS7;    }    break;    default:    case 8:    {        new_cfg.c_cflag |=CS8;    }    break;}/*奇偶校验*/switch(parity){    default:    case 'n':    case 'N':    {        new_cfg.c_cflag &=~PARENB;        new_cfg.c_iflag &=~INPCK;    }    break;    case 'o':    case 'O':    {        new_cfg.c_cflag |= (PARODD | PARENB);        new_cfg.c_iflag |= INPCK;    }    break;    case 'e':    case 'E':    {        new_cfg.c_cflag |= PARENB;        new_cfg.c_cflag    &= ~PARODD;        new_cfg.c_iflag |= INPCK;    }    break;    case 's':    case 'S':    {        new_cfg.c_cflag &= ~PARENB;        new_cfg.c_cflag &= ~CSTOPB;    }    break;}/*设置停止位*/switch(stop_bits){    default:    case 1:    {        new_cfg.c_cflag &= ~CSTOPB;    }    break;    case 2:    {    new_cfg.c_cflag |= CSTOPB;    }}new_cfg.c_cc[VTIME] = 0;new_cfg.c_cc[VMIN] = 1;/*处理未接受字符*/tcflush(fdTCIFLUSH);/*激活新配置*/if((tcsetattr(fdTCSANOW&new_cfg))!=0){    perror(""tcsetattr"") exit (-1);}return 0;

}

int open_port(void){
int fd;
fd =open(""dev/ttyS1""O_RDWR|O_NOCTTY|O_NDELAY);
if(fd < 0)

{

perror(""open serial port"") exit (-1);

}

if(fcntl(fdF_SETFL0)<0)
{
perror(""fcntl F_SETFL
"");
exit (-1);
}

if(isatty(STDIN_FILENO)==0){    perror(""standrd input is not a terminal device"");    exit (-1);}return fd;

}

void read_485 (void)
{
char buff[100] = {0};

int fdsi;int len = 0;int fd_gpio = 0;unsigned char val;fd_gpio = open(DEV_PIO_LED O_RDWR);if(fd_gpio < 0){perror(""fd_gpio open err"");exit (-1);}//set dir of the pindavinci_gio_arg arg;            arg.pin_idx = PIO_NUM;        arg.pin_dir = AT91PIO_DIR_OUT;arg.pin_sta = 0;  ioctl(fd_gpio IOCTL_PIO_SETDIR &arg); //set the value of the pinioctl(fd_gpio IOCTL_PIO_SETSTA &arg); if((fds = open_port())<0)//打开设备{    perror(""open_port"");    exit (-1);}if(set_com_config(fds24008'N'1)<0)//配置串口{    perror(""set_com_config"");    exit (-1);}printf (""rev ready!
"");len = read (fds buff sizeof (buff));if (len < 0){perror (""read err"");exit (-1);}printf (""%s
"" buff);close (fds);printf (""test aaaaa
"");

}

void *write_rs485(void)
{
int fdsi;
int len = 0;
int fd_gpio = 0;
unsigned char val;

fd_gpio = open(DEV_PIO_LED O_RDWR);if(fd_gpio < 0){perror(""fd_gpio open err"");exit (-1);}//set dir of the pindavinci_gio_arg arg;            arg.pin_idx = PIO_NUM;        arg.pin_dir = AT91PIO_DIR_OUT;arg.pin_sta = 1;  ioctl(fd_gpio IOCTL_PIO_SETDIR &arg); //set the value of the pinioctl(fd_gpio IOCTL_PIO_SETSTA &arg); if((fds = open_port())<0)//打开设备{    perror(""open_port"");    exit (-1);}if(set_com_config(fds24008'N'1)<0)//配置串口{    perror(""set_com_config"");    exit (-1);}

// while(1)
// {
printf(""send ready!
"");
char buff[] = ""aa 55 05 00 33 44 14 90 00"";
int len1 = write(fdsbuffsizeof (buff));
if (len1 < 0)
{
perror (""write err"");
exit (-1);
}
printf (""send ok!
"");

// }
close (fds);
}

int main (void)
{
pthread_t tTransCtrlThread;
if(pthread_create(&tTransCtrlThreadNULLwrite_rs485NULL))
{
perror (""read_rs485 create fail"");
exit (-1);
}
sleep (5);
read_485();
return 0;
}

解决方案

RS232 串口通信
RS232串口通信详解
RS232串口通信详解

解决方案二:
什么东西啊,可以教教我吗

时间: 2024-08-03 22:21:55

rs485多路串口通信 。。的相关文章

C#串口通信和以太网通讯 实时采集下位机的电压、电流、温度等多路数据

问题描述 请教各位大神,我需要用vsc#,实时采集下位机的电压.电流.温度等多路数据,以便后续的界面开发.求教各位大神能不能用串口或以太网通讯实现?具体的学习内容和步骤是怎样的?不甚感激,万谢,万谢! 解决方案 解决方案二:实时采集下位机的电压.电流.温度等多路数据下位机有接口给你吗?或者会实时发送数据出来吗?解决方案三:谢谢您的回复.是的,下位机连有接口,我要怎么通过以太网通讯给下位机发读指令读取数据,实现实时采集?另外,请问学习IEC60870-5-101/104的侧重点在哪里?最好有以太网

VisualBasic串口通信程序设计

1mscomm.vbx通信控件描述 mscomm.vbx通信控件可直接从vb的toolbox中加入窗体form,即可用其进行通信.若toolbox中无此控件,则用tools的customcontrols将mscomm.vbx从windows的system子目录中加入vb的toolbox中. 1.1通信方式 mscomm.vbx有2种不同的方式来处理和解决各类通信软件的开发和设计问题 1.事件驱动.它与c/c 写windows软件时的窗口回调函数类似,是1种功能强大的处理问题的方法.在实际工作中,

《单片机串口通信及测控应用实战详解》——6.1 系统设计说明

6.1 系统设计说明 单片机串口通信及测控应用实战详解6.1.1 设计任务PC通过RS485串行口将十六进制数(如01 11,其中01表示单片机地址,11表示继电器状态)发送给多个单片机,驱动地址吻合的单片机继电器动作,并在数码管显示接收的数据.单片机接收到数据后,返回十六进制数(如01 11)给PC.具体任务如表6-1所示. 6.1.2 线路连接 当PC与多台具有RS-232接口的单片机开发板通信时,可使用RS-232/RS-485通信接口转换器,将计算机上的RS-232通信口转为RS-485

C#中的串口通信

关于串行接口 串行接口(Serial port)又称"串口",主要用于串行式逐位数据传输.常见的有一般电脑应用的RS-232(使用 25 针或 9 针连接器)和工业电脑应用的半双工RS-485与全双工RS-422. 串行接口按电气标准及协议来分,包括RS-232-C.RS-422.RS485.USB等. RS-232-C.RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件.电缆或协议.USB是近几年发展起来的新型接口标准,主要应用于高速数据传输领域. RS-232-

我在写串口通信程序遇到的坑

我在做基于HC6800的51单片机上,写串口通信程序遇到了许多坑. 一个大坑:为什么HC6800上U转串口不能发送数据. 因为我们向HC6800烧程序都是使用图1所示的软件,所以我想当然地认为可以直接通过HC6800上的U转串进行串口通信,而我的同学信誓旦旦地告诉我可以.坑爹.并且这个软件好像也在提示可以用直接用U转串,进行串口通信(见图2).但是当我打开串口调试助手的时候(如图3),却发现单片机掉电了(如图4).其实HC6800上有另一个串口的,我们只要把连接图5黄框处串口.并且在图4中的6处

STM8L151G6串口通信问题

问题描述 STM8L151G6串口通信问题 哪位大神用过STM8低功耗的单片机 最近在用这个调到串口通信怎么也调不通了,谁有这个方面经验分享下.感激不尽,坐等回复 解决方案 http://www.pudn.com/downloads554/sourcecode/embedded/detail2285865.html

单片机读写内部的EEPROM怎么操作,串口通信我已经做好了?

问题描述 单片机读写内部的EEPROM怎么操作,串口通信我已经做好了? 我要从PC上把数据发给单片机,单片机接收到后存储到EEPROM,单片机读取EEPROM的数据发送到PC上,我看了手册.网上查过资料,做了好久,没 有实现,单片机是STC15F2K16S2,求指导 解决方案 你没有实现,是卡在什么地方了?PC 与单片机的串口通讯.还是 EEPROM 的读写呢? 解决方案二: 我是卡在了EEPROM的读写了,看了手册.百度过了,还是不能实现EEPROM的读写,我用的单片机是15F2S16S2,用

在php串口通信编程时,出现win_serial is not compiled into PHP

问题描述 在php串口通信编程时,出现win_serial is not compiled into PHP 最近想试试php的串口通信,我装的是phpstudy2014,我看了一下apache2.4和php5xx等系列都装在里面,于是下了个对应php版本的php_ser++.dll,并且放在了ext中,并在php.ini中添加了extension=php_ser++.dll,但用php designer8.0调试时,却出现了win_serial不能被编译成PHP,事关紧急,忘大神指导?????

在CB6下基于api函数编写串口通信程序简介

1-在C++ Builder 6.0下基于api函数编写串口通信程序简介: 在dos/win95/win98的年代,操作系统对串口是不保护的,也就是说将串口的的资源完全开放给用户,用户可以用直接操作硬件的函数(比如说TC2.0下的inport()和outport()函数) 跟串口直接打交道,这时候用户使用直接操作串口的函数怎样"折磨"串口都是没有问题的,操作系统根本就不管不问,对串口操作所造成的一切后果都是用户一个人承担的,这时候用户对串口具有高度自由的支配权:但是,这种情况好景不长,