社区
Linux/Unix社区
帖子详情
串口通信编程问题
licui123cui
2011-06-06 05:58:58
我就想通过ARM9控制模块作为主机,多个单片机采集模块作为从机,主机发送命令帧,对应的从机开始传输数据.问题是我现在不知道如何编写让主机发送命令帧的程序?希望各位高手帮我看看,谢谢,急!!!
...全文
88
13
打赏
收藏
串口通信编程问题
我就想通过ARM9控制模块作为主机,多个单片机采集模块作为从机,主机发送命令帧,对应的从机开始传输数据.问题是我现在不知道如何编写让主机发送命令帧的程序?希望各位高手帮我看看,谢谢,急!!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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协议包的格式,可以定义自己的格式,但一般都包括上面几个字段
串口通信
编程
大全
这时我以前编制rs-232串口程序时收集的一些有关串口
编程
的硬件和软件技术资料,对于想学习串口
编程
的朋友比较实用的。里面讲述了有关串口的基本支持和用VB通信时的一些技巧和注意方法。声明:本资料来自互联网,版权...
Visual C++/Turbo C
串口通信
编程
实践(第2版)教材清晰版
《Visual C++/Turbo C
串口通信
编程
实践(第2版)》是龚建伟老师编写的关于
串口通信
编程
的教材,主要面向使用Visual C++和Turbo C环境的程序员。在本书中,作者深入浅出地讲述了
串口通信
的基本原理、
编程
方法和应用实践...
Delphi
串口通信
编程
资料
串口通信
中可能会遇到各种
问题
,如硬件故障、参数配置错误、数据溢出等。因此,良好的错误处理机制是必不可少的。开发者应学会使用Try...Except结构捕获异常,以及如何利用DebugView等工具进行日志记录和调试。 6. ...
Rs232cai-7884
串口通信
编程
合集 pdf.rar
Rs232cai-7884
串口通信
编程
合集 pdf,
串口通信
编程
大全。内容: 1. RS-232-C 详解 2.
串口通信
基本接线方法 3. 串口通讯的概念及接口电路 4. 有关RS232和RS485接口的问答 5. 同步通信方式 6. 通信协议 7. ...
VC++
串口通信
串口软件程序18个经典源码合集.zip
VC++
串口通信
串口软件程序18个经典源码合集: VC
串口通信
程序.rar VC 读串口话是动态波形,非常好的应用程序,有源码....VC++环境下用MSComm控件进行串口通讯
编程
模型飞机测控平台.rar vc++编写的串口检测程序开发.rar
Linux/Unix社区
23,217
社区成员
74,540
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章