串口通信编程问题

licui123cui 2011-06-06 05:58:58
我就想通过ARM9控制模块作为主机,多个单片机采集模块作为从机,主机发送命令帧,对应的从机开始传输数据.问题是我现在不知道如何编写让主机发送命令帧的程序?希望各位高手帮我看看,谢谢,急!!!
...全文
84 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
licui123cui 2011-06-10
  • 打赏
  • 举报
回复
我试过了串口设置是正确的,不管怎么改就不运行从while(STOP==FALSE)开始的语句!还有别的解决办法吗?
tracyjk 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 licui123cui 的回复:]
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>

#define BAUDRATE B115200
#define M……
[/Quote]
在while(STOP==FALSE){前加句打印语句,如果还是加的打印语句打不出来,问题就出在了串口的设置方面了,可以去看看串口设置方面的内容
licui123cui 2011-06-09
  • 打赏
  • 举报
回复
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>

#define BAUDRATE B115200
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;

int main( )
{
int fd,res;
struct termios oldtio,newtio;
char buf[256];
printf("Start...\n");
/*打开arm平台的COM1通信端口*/
fd=open(MODEMDEVICE,O_RDWR|O_NOCTTY);
if(fd<0)
{
perror(MODEMDEVICE);
return -1;
}
printf("open...\n");
/*将目前终端机的结构保存至oldtio结构*/
tcgetattr(fd,&oldtio);
/*清除newtio结构,重新设置通信协议*/
bzero(&newtio,sizeof(newtio));
/*通信协议设为8N1*/
newtio.c_cflag =BAUDRATE|CS8|CREAD|CLOCAL;//波特率,数据位,忽略任何调制解调器状态,启动接收器
newtio.c_iflag=IGNPAR;//忽略奇偶校验错误
newtio.c_oflag=0;//设输出模式非标准型,同时不回应
newtio.c_lflag=ICANON;//设置为正规模式
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
/*清除所有队列在串口的输出*/
tcflush(fd,TCIFLUSH);
/*新的termios的结构作为通信端口的参数*/
tcsetattr(fd,TCSANOW,&newtio);
while(STOP==FALSE){
printf("\n\rReading...");
//fflush(stdout);
res=read(fd,buf,256);
buf[res]='\0';
printf("%s:",buf);
if (buf[0]=='@'){
STOP=TRUE;
printf("\n");
}
}
printf("Close...\n");
//close(fd);
/*恢复旧的通信端口参数*/
tcsetattr(fd,TCSANOW,&oldtio);
return 0;
}
大家帮我看看看为啥程序运行到printf("open...\n");就不往下运行了。希望尽快能解决啊!
licui123cui 2011-06-08
  • 打赏
  • 举报
回复
恩这个方法可以考虑,谢谢
tracyjk 2011-06-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 licui123cui 的回复:]
引用 4 楼 tracyjk 的回复:
自己定义个通信协议,利用串口来收发数据信息
然后分别在arm9和单片机上编程实现通信

我现在没有单片机板子,定义了俩个线程,一个线程发数据信息到串口再用另一线程接收串口的数据这样应该可以吧?编译没有错误,但是在终端上执行的时候,数据发送不出去总是出现:killed就截止了
[/Quote]

既然没有单片机板子的话那你的2个程序就不要用串口来通信了,可以想下用其他的,共享内存、文件或者其他什么的来模拟实现通信。把你自己定义的通信协议先实现了,等有设备了再实现串口通信的部分
个人意见,仅供参考
licui123cui 2011-06-07
  • 打赏
  • 举报
回复
/*串口数据帧格式封装*/
typedef struct
{
unsigned char Sync; /*同步信号*/
unsigned char NetNum; /*网络号*/
unsigned char SrcAddr; /*源地址*/
unsigned char DesAddr; /*目的地址*/
unsigned char Command; /*命令字*/
unsigned char Data[64]; /*数据段*/
unsigned char enddata; /*尾帧*/
}Packet;
这是我定义的一个结构体,把它作为发送命令包可以吗?希望给予指点!
licui123cui 2011-06-07
  • 打赏
  • 举报
回复
那么对于串口到底是发送还是接收该如何设置?
licui123cui 2011-06-07
  • 打赏
  • 举报
回复
void ReadDataPackInit(Packet *PPacket)
{
unsigned int i;
PPacket->Sync = 0xFE; // 1th
PPacket->NetNum = 0x01;
PPacket->SrcAddr = 0xFF;
PPacket->DesAddr = 0x01; //485 slave addr
PPacket->Command =0x41; //read data function
for(i=0;i<64;i++){
PPacket->Data[i]=0x30;
}
PPacket->enddata=0x0D;
unsigned int k=5,j=0;
wbuf[0] = PPacket->Sync;
wbuf[1] = PPacket->NetNum;
wbuf[2] = PPacket->SrcAddr;
wbuf[3] = PPacket->DesAddr;
wbuf[4] = PPacket->Command;
for(k=5;k<69;i++){
wbuf[k] = PPacket->Data[j];
j++;
}
wbuf[69]= PPacket->enddata;
wbuf[70]='\0';
}
void *Send_Uart1(void)

{
int wr485;//读写485返回值
int rel; //rel 串口初始化返回值rel
UARTMODE set; //串口模式结构体变量
Packet *PPacket ;

printf("uart 485 test !\n");
/*测试串口是否打开并对串口进行设置*/
fdcom1=open(COM0,O_RDWR|O_NOCTTY |O_NDELAY);
if(fdcom1==-1)
{
printf("Can't Open serial port1!");
return ;
}
printf("serial 485 open ok!fd = %d\n",fdcom1);

set.stopb = 1;
set.datab = 8;
set.parity =0;
/*串口初始化设置,设置成功返回“OK”*/
if((rel = UART_Ini(fdcom1,115200,set))<0) //set serial
{
printf("com initial error!");
perror("set_opt error\n");
return ;
}
printf("OK\n");
/*设置串口要发送数据,并进行发送和接收*/

printf("send data: \n");

ReadDataPackInit(PPacket);
write(fdcom1,wbuf,strlen(wbuf)); /*开始发送数据*/
sem_post(&sem485);
memset(wbuf, '\0',sizeof(rbuf));
close(fdcom1);
}
程序运行到printf("send data: \n");就出现killed,希望大家都能帮我看看
licui123cui 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tracyjk 的回复:]
自己定义个通信协议,利用串口来收发数据信息
然后分别在arm9和单片机上编程实现通信
[/Quote]
我现在没有单片机板子,定义了俩个线程,一个线程发数据信息到串口再用另一线程接收串口的数据这样应该可以吧?编译没有错误,但是在终端上执行的时候,数据发送不出去总是出现:killed就截止了
zjf30366 2011-06-07
  • 打赏
  • 举报
回复
tcgetattr,tcsetattr
手机写程序 2011-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 licui123cui 的回复:]
/*串口数据帧格式封装*/
typedef struct
{
unsigned char Sync; /*同步信号*/
unsigned char NetNum; /*网络号*/
unsigned char SrcAddr; /*源地址*/
unsigned char DesAddr; /*目的地址*/
unsigned char Command; /*命令字*/
unsi……
[/Quote]
差不多就这样吧,再加个校验吧。
tracyjk 2011-06-07
  • 打赏
  • 举报
回复
自己定义个通信协议,利用串口来收发数据信息
然后分别在arm9和单片机上编程实现通信
fontlose 2011-06-06
  • 打赏
  • 举报
回复
主要是发送方命令打包,接收方解包。一般命令包括
包起始+丛机地址+命令字段+数据长+数据+校验
可以参考modbus协议包的格式,可以定义自己的格式,但一般都包括上面几个字段

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧