关于串口通信的问题 急啊!!!

haitukeji 2013-01-30 03:49:30
我写一个串口通信的代码,通过串口发送数据,首先申明硬件已经通了,就是发送的时候发送不出去,接收端显示不出数据,接受端也是正确的,通过发送工具发送是可以的,代码如下,请指教一下为什么我发送不出去!哪里设置可能出问题了。
void set_speed(int fd, int speed)
{
struct termios Opt;
tcgetattr(fd, &Opt);
for(int i = 0; i < sizeof(speed_arr)/sizeof(int); i++)
{
if(speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
int status = tcsetattr(fd, TCSANOW, &Opt);
if(status != 0) perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}

int set_parity(int fd, int databits, int stopbits, int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0)
{
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits)
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size\n");
return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB);
options.c_iflag |= INPCK;
break;
case 'e':
case 'E':
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
options.c_iflag |= INPCK;
break;
case 'S':
case 's':
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
fprintf(stderr,"Unsupported parity\n");
return (FALSE);
}

switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}


if(parity != 'n') options.c_iflag |= INPCK;
options.c_cc[VTIME] = 150;
options.c_cc[VMIN] = 0;

tcflush(fd,TCIFLUSH);
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}

int port_in()
{
if(fd != 0){
char data[8];
int i = read(fd, data, sizeof(data));
printf("recv i=%d\n",i);
for(int j=0;j<i;j++){
printf("recv %d\n",data[i]);
}
printf("\n");
}
}
int port_in_w(){
while(fd != 0){
port_in();
}
}
void disable_terminal_return(int fd)
{
struct termios newt;

tcgetattr(fd, &newt);

newt.c_lflag &= ~(ICANON | ECHO);

tcsetattr(fd, TCSANOW, &newt);
}
void check_port_open(unsigned baud)
{
if(fd == 0){
char * dev ="/dev/ttyAMA1";
fd = open(dev, O_RDWR);
if(-1 == fd)
{
fd = 0;
printf("Can't Open Serial Port!\n");
return;
}
else
{
printf("dev=%s\n",dev);
}

set_speed(fd, baud);
set_parity(fd, 8, 1, 'N');
disable_terminal_return(fd);
}
}

int port(unsigned baud, char *data, int data_length)
{
// printf("send len=%d\n", data_length);
for(int i = 0; i < data_length; ++i){
printf("sned %d\n",data[i]);
}
printf("\n");

check_port_open(baud);

if(fd != 0){
write(fd, data, data_length);
}
printf("send buffer\n");
}

void close_port()
{
if(fd == 0)return;
close(fd);
fd = 0;
}


int main()
{
char buffer[3];
buffer[0]=1;
buffer[1]=2;
buffer[2]=3;
printf("buffer0=%d,buffer1=%d,buffer2=%d\n",buffer[0],buffer[1],buffer[2]);
port(9600,buffer,3);
while(1){
port(9600,buffer,3);
sleep(2);
}
return 0;
}

...全文
285 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjb955201 2014-02-14
  • 打赏
  • 举报
回复
引用 2 楼 Wang_sir 的回复:
先用示波器量TX、RX上有没有数据信号, 如果TX、RX都没有,则为发送有问题,检测自己的软件代码。 如果TX、RX都有,则硬件没有问题,发送也没有问题,检查自己的接收buffer内数据是否有变化,以及timeout设定是不是太短。 如果TX有RX没有,则是硬件收到数据没有发送数据回来或者硬件收到了错误的数据,检查软件对发送数据的设置和硬件端接收的设置。
这个兄弟一看就做的项目挺多, 软硬件都懂.
reaibiancheng 2013-09-24
  • 打赏
  • 举报
回复
这是在什么平台上写的串口程序啊?
Jackshengwang 2013-01-30
  • 打赏
  • 举报
回复
先用示波器量TX、RX上有没有数据信号, 如果TX、RX都没有,则为发送有问题,检测自己的软件代码。 如果TX、RX都有,则硬件没有问题,发送也没有问题,检查自己的接收buffer内数据是否有变化,以及timeout设定是不是太短。 如果TX有RX没有,则是硬件收到数据没有发送数据回来或者硬件收到了错误的数据,检查软件对发送数据的设置和硬件端接收的设置。
zhaokai115 2013-01-30
  • 打赏
  • 举报
回复
linux的console编程不太懂,串口一般就是波特率、数据位、停止位、校验位以及流控方式。这几个参数两边match了就没太大问题。 还有你的buffer里还是填几个可显示字符比如‘a’,‘b’,‘c’之类的吧,也许你已经接收到了,只是1,2,3不能显示出来而已。
ABB IRC5P系统的IPS结构 IRC5P新喷漆控制柜 统一的电柜尺寸(参考S4P有紧凑型与扩展型)) 主电缆接口与S4P+相同(除 IRB5500) 系统1最多支持8 系统2最多支持6 (pumps,handleretc.) 一个变压器涵盖200-600VAC电压输入 分布式I/O(串口通信) LED指示(similar S4P+)新特性 IRC5P电柜内部 IRC5P电柜内部 IRC5P电柜内部 IRC5P电柜内部 IRC5P电源系统 同一变压器器的输入电压的范围200-600VAC 115VAC与230VAC的输出是独立的线圈. IRC5P电源分配模块PDB 提供24VDC电压与分配. 通过USB与MC通信(状态与备份后断电). +24V供给: IRC5P驱动系统 DSQC601轴计算机控制机器人的运动 SDI控制工艺设备 S4P+与IRC5P相同处: SMU测量板 MCOB机器人控制板 IRC5P主计算机 基于intelceleron 1个RS485口(喷涂控制柜未使用) PCI插槽 紧凑型flashdisk 接口 PDB状态 IRC5P喷涂界面板PIB 基于PowerPCMPC5200 处理器 TPU与MP之间的TPU 通讯接口 IPS计算机 SPIbus SIB 与MIB SPIport ALED 显示板 SPIbus IO节点. 2xCAN/devicenet ports: CANbus IPS,Fieldbus, nodes,Robot 3x以太网口: MP的以太网通讯(包括TPU通讯) IRC5P本体接口板MIB boardI.S. barriers ATEXsertified [EEx ib] IIC inputs serialmeasurement board batterilow alarm ATEXsertified [EEx ib] IIC outputs Integratedholder disposallithium battery powerrelays(drives) PDBrelay interface(brake,HV,func,24V IO etc.) Expcontrolled communication link processequipment: TwoCAN/Devicenet ports ThreeRS422 ports serialmeasurement boards SPIslave communication RS485communication relaystatus Axiscomputer airsupplyetc. IRC5P安全接口板SIB SPI子站到PIB (与MIB相同总线) IRC5P喷涂示教器 运行平台WindowsCE ATEX/FMsertified EEx ib EEx IIBT4 IRC5P示教器接口板TIB Exiinterface I.S.使能把手及示教器停的线缆 I.S.供电给TPU I.S.通信接口 ATEX/FMsertified EEx ib IIB IRC5P外部连接 支持4CAN bus 节点 OptionalIPS CAN connection bottomdin rail externalnodes 主电缆与S4P相同(IRB5500除外) 清扫传感器的Exi电缆与SMU 备份电源位于MIB TPU连接到柜子的底部 PDB上24VDC电源是可选项,可作外部使用 USBf的系统备份 CANbus 结构

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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