串口通信编程问题

licui123cui 2011-06-06 05:58:58
我就想通过ARM9控制模块作为主机,多个单片机采集模块作为从机,主机发送命令帧,对应的从机开始传输数据.问题是我现在不知道如何编写让主机发送命令帧的程序?希望各位高手帮我看看,谢谢,急!!!
...全文
129 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协议包的格式,可以定义自己的格式,但一般都包括上面几个字段
里面讲了MSComm控件 、 WinAPI 串口通信、CSerial类,例子很详实,每一步操作都有解释。作者是龚建伟,有一个个人主页www.gjwtech.com,讲串口通信的内容比较多,还行,大家可以先看看这个主页。 本书目录 第1章轻松体验串口通信编程与调试 1.1初识串口 1.1.1从外观上了解串口 1.1.2 串口通信的发展前景 1.2 自己制作简单的串口线 1.2.1 三线制串口接线的规定 1.2.2 焊接制作自己的串口连接线 1.3 调试串口通信程序时的几种使用串口的技巧 1.3.1 查看计算机串口资源 1.3.2 常规调试-2个物理串口之间的通信 1.3.3 特殊调试-单个物理串口之间的通信 1.3.4 虚拟串口-为计算机添加取之不尽的串口资源 1.4 使用串口调试助手来体验串口通信 1.5体验Windows环境下Visual C++串口通信编程 1.6体验DOS环境下Turbo C串口通信编程 第2章 VC多线程串口编程工具CSerialPort类 2.1 类功能及成员函数介绍 2.2 应用CSerialPort类编制基于对话框的应用程序 2.3 应用CSerialPort类编制基于单文档的应用程序 2.4对CSerialPort类的改进 2.5 在Visual C++.NET中应用CSerialPort类 第3章 控件MSComm串口编程 3.1 MSComm控件详细介绍 3.1.1 VC中应用MSComm控件编程步骤 3.1.2 MSComm控件串行通信处理方式 3.1.3 MSComm 控件的属性说明 3.1.4 MSComm控件错误信息 3.2使用MSComm控件的几个疑难问题 3.2.1使用VARIANT 和SAFEARRAY 数据类型从串口读写数据 3.2.2 MSComm控件能离开对话框独立存在吗? 3.2.3 如何发送接收ASCII值为0和大于128的字符? 3.2.4 在同一程序中用MSComm控件控制多个串口的具体操作方法 3.2.5解决使用控件编程时程序占用的内存会不断增大的问题 3.2.6在没有安装Visual Studio的计算机上如何使用MSComm控件 3.2.7 在MSComm控件串口编程时遇到的其它问题说明 3.3在基于单文档(SDI)程序中应用MSComm控件 3.4应用MSComm控件控制多个串口实例 第4章 Windows API串口编程 4.1 Windows API串口编程概述 4.2 API串口编程中用到的结构及相关概念说明 4.2.1 DCB(Device Control Block)结构 4.2.2超时设置COMMTIMEOUTS结构 4.2.3 OVERLAPPED异步I/O重叠结构 4.2.4 通信错误与通信设备状态 4.2.5 串行通信事件 4.3 Windows API串行通信函数 4.4 Win32 API串口通信编程的一般流程和特殊实例 4.4.1 Win32 API串口通信编程的一般流程 4.4.2 用查询方式读串口 4.4.3同步I/O读写数据 4.4.4 关于流控制的设置问题 4.5 CSerialPort类中的API函数编程应用剖析 4.6 Win32 API串口编程TTY(虚拟终端)实例 4.7 Windows API串口精简例程 第5章 串口调试助手V2.2详细编程 5.1 建立SCOMM程序工程实现界面功能 5.2 串口的初始化及关闭 5.3串口数据的发送与接收及十六进制数据的处理 5.3.1 十六进数据发送处理 5.3.2 手动发送处理 5.3.3自动发送处理 5.3.4 接收处理及十六进制显示 5.4 其它辅助功能的实现 5.4.1 接收数据的文件保存 5.4.2 实现小文件发送 5.4.3 图钉按钮功能使程序能浮在最上层 5.4.4 对话框动画图标的实现 5.4.5 超链接功能的实现 5.4.6 如何打开帮助网页文件 第6章 DOS环境下的Turbo C串口编程及通用实例GSerial类 6.1 PC机异步通信适配器8250及其编程操作 6.1.1 INS8250内部寄存器及其选择方式 6.1.2 波特率设置 6.1.3数据位、奇偶校验、停止位等数据格式设置 6.1.4 查询I/O方式相关设置 6.1.5 中断I/O通信方式相关设置 6.1.6 Modem寄存器 6.2 COMRXTX程序实例
书名:《C/C++串口通信典型应用实例编程实践》(电子工业出版社.曹卫杉) PDF扫描版,全书共分10章,共316页。 内容介绍 本书从工程应用的角度出发,对目前流行的三种不同类型的C/C++语言(包括C++ Builder、Visual C++和LabWindows/CVI)开发串口通信(也称为串行通信)程序进行了阐述。 基础篇简单介绍了C/C++语言实现串口通信需要的基本知识;应用篇通过PC与PC、PC与单片机、PC与智能仪器、PC与PLC、PC与GSM短信模块、PC与远程I/O模块等典型应用实例,详细介绍了C/C++语言利用MSComm控件、API函数实现串口通信的程序设计方法。每个实例的设计任务同时采用C++ Builder、Visual C++和Labgrmdows/CVI实现。 本书内容丰富,结构清晰,文字叙述深入浅出,通俗易懂,以实践应用为主,突出程序设计,重在功能实现,有较强的实用性和可操作性。 本书可作为高等院校计算机应用、测控技术、机电一体化、自动化等专业的研究生、本科生以及计算机测控系统研发的工程技术人员等学习C/C++串口通信编程技术的参考书。 目录 基础篇   第1章 串口通信基础   1.1 串口通信的基本概念   1.2 串口通信及其标准   1.3 串口通信调试   第2章 C/C++编程语言与串口通信   2.1 串行通信控件MSComm   2.2 API函数   2.3 线程   2.4 LabWindows/CVI串口通信函数 应用篇   第3章 PC与PC串口通信程序设计   3.1 设计说明   3.2 任务实现   第4章 PC与单片机串口通信程序设计   4.1 设计说明   4.2 任务实现   第5章 PC与智能仪器串口通信程序设计   5.1 设计说明   5.2 任务实现   第6章 PC与PLC串口通信程序设计   6.1 设计说明   6.2 任务实现   第7章 PC与GSM短信模块串口通信程序设计   7.1 设计说明   7.2 任务实现   第8章 PC与读卡器串口通信程序设计   8.1 设计说明   8.2 任务实现   第9章 PC与智能仪器构成的DCS程序设计   9.1 设计说明   9.2 任务实现   第10章 PC与远程I/O模块构成的DCS程序设计   参考文献

23,223

社区成员

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

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