#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h> /*系统类型定义*/
#include <sys/stat.h> /*系统状态定义*/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
#include <string.h>
int spaceSerialPort(int m_fd) //空校验
{
int fd=m_fd;
struct termios serialAttr;
memset(&serialAttr, 0, sizeof serialAttr);
serialAttr.c_cflag |= PARENB|CMSPAR|PARODD;
if(tcsetattr(fd, TCSANOW, &serialAttr) !=0) //配置立刻起作用
{
perror("serial error");
return -1;
}
return 0;
}
int main(void)
{
int fd = -1;
const char *devName = "/dev/ttyUSB0";
fd = open(devName, O_RDWR|O_NONBLOCK);
if (fd < 0) {
return -1;
}
struct termios serialAttr;
memset(&serialAttr, 0, sizeof serialAttr);
serialAttr.c_iflag = IGNPAR;
serialAttr.c_cflag = B9600 | HUPCL | CS8 | CREAD | CLOCAL;
serialAttr.c_cc[VMIN] = 0;
//serialAttr.c_cflag |= PARENB|CMSPAR|PARODD;
if (tcsetattr(fd, TCSANOW, &serialAttr) != 0) {
return -1;
}
spaceSerialPort(fd);
while(1)
{
char addr = 0x01;
write(fd, &addr, 1);
usleep(90000);
}
}
2012年10月18日20:50:48:
突然想想,mark,space还没搞准确,就来这个,先试试用子函数来改奇偶校验试试
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h> /*系统类型定义*/
#include <sys/stat.h> /*系统状态定义*/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
#include <string.h>
int spaceSerialPort(int m_fd) //空校验
{
int fd=m_fd;
struct termios serialAttr;
memset(&serialAttr, 0, sizeof serialAttr);
serialAttr.c_cflag |= PARENB;//JI
serialAttr.c_cflag &= ~PARODD;
if(tcsetattr(fd, TCSANOW, &serialAttr) !=0) //配置立刻起作用
{
perror("serial error");
return -1;
}
return 0;
}
int main(void)
{
int fd = -1;
const char *devName = "/dev/ttySAC1";
fd = open(devName, O_RDWR|O_NONBLOCK);
if (fd < 0) {
return -1;
}
struct termios serialAttr;
memset(&serialAttr, 0, sizeof serialAttr);
serialAttr.c_iflag = IGNPAR;
serialAttr.c_cflag = B9600 | HUPCL | CS8 | CREAD | CLOCAL | PARENB;
serialAttr.c_cflag |= PARODD; //JI
serialAttr.c_cc[VMIN] = 0;
//serialAttr.c_cflag |= PARENB|CMSPAR|PARODD;
if (tcsetattr(fd, TCSANOW, &serialAttr) != 0) {
return -1;
}
spaceSerialPort(fd);
while(1)
{
char addr = 0x03;
write(fd, &addr, 1);
usleep(90000);
}
}
2012年10月18日21:08:18:实验通过,在此铭记!!!!!是可以通过子函数来更忙串口的校验方式的!!!!!
================================================================================================================
2012年10月21日14:54:34:
0.3:
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h> /*系统类型定义*/
#include <sys/stat.h> /*系统状态定义*/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
#include <string.h>
struct termios serialAttr;
int spaceSerialPort(int m_fd) //空校验
{
int fd=m_fd;
serialAttr.c_cflag |= PARENB | PARODD | CMSPAR;//ou
if(tcsetattr(fd, TCSANOW, &serialAttr) !=0) //配置立刻起作用
{
perror("serial error");
return -1;
}
return 0;
}
int markSerialPort(int m_fd) //
{
int fd=m_fd;
serialAttr.c_cflag |= PARENB | CMSPAR;//ou
serialAttr.c_cflag &= ~PARODD;
if(tcsetattr(fd, TCSANOW, &serialAttr) !=0) //配置立刻起作用
{
perror("serial error");
return -1;
}
return 0;
}
int main(void)
{
int fd = -1;
const char *devName = "/dev/ttySAC1";
fd = open(devName, O_RDWR|O_NONBLOCK);
if (fd < 0) {
return -1;
}
memset(&serialAttr, 0, sizeof serialAttr);
serialAttr.c_iflag = IGNPAR;
serialAttr.c_cflag = B9600 | HUPCL | CS8 | CREAD | CLOCAL ;
serialAttr.c_cflag |= PARODD; //JI
serialAttr.c_cc[VMIN] = 0;
if (tcsetattr(fd, TCSANOW, &serialAttr) != 0) {
return -1;
}
spaceSerialPort(fd);
while(1)
{
char addr = 0x03;
write(fd, &addr, 1);
usleep(90000);
}
}
==================================================================================================================
2012年10月21日17:33:56:
v0.4
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h> /*系统类型定义*/
#include <sys/stat.h> /*系统状态定义*/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
#include <string.h>
struct termios serialAttr;
const char data[]={0x02,0x01,0x05};
int spaceSerialPort(int m_fd) //空校验
{
int fd=m_fd;
serialAttr.c_cflag |= PARENB | PARODD | CMSPAR;//ou
if(tcsetattr(fd, TCSANOW, &serialAttr) !=0) //配置立刻起作用
{
perror("serial error");
return -1;
}
return 0;
}
int markSerialPort(int m_fd) //
{
int fd=m_fd;
serialAttr.c_cflag |= PARENB | CMSPAR;//ou
serialAttr.c_cflag &= ~PARODD;
if(tcsetattr(fd, TCSANOW, &serialAttr) !=0) //配置立刻起作用
{
perror("serial error");
return -1;
}
return 0;
}
int main(void)
{
int fd = -1;
const char *devName = "/dev/ttySAC1";
char read_buf[33];
fd = open(devName, O_RDWR|O_NONBLOCK);
if (fd < 0) {
return -1;
}
memset(&serialAttr, 0, sizeof serialAttr);
serialAttr.c_iflag = IGNPAR;
serialAttr.c_cflag = B9600 | HUPCL | CS8 | CREAD | CLOCAL ;
serialAttr.c_cflag |= PARODD; //JI
serialAttr.c_cc[VMIN] = 0;
if (tcsetattr(fd, TCSANOW, &serialAttr) != 0) {
return -1;
}
while(1)
{
printf("hw\n");
char addr = 0x02;
char i = 0;
markSerialPort(fd);
write(fd, &addr, 1);
usleep(1000);
spaceSerialPort(fd);
write(fd, data, 3);
usleep(90000);
read(fd,read_buf,sizeof read_buf);
for(i=0;i<33;i++)
{
printf("%u",read_buf[i]);
}
printf("\n");
}
}
结果:
[root@FriendlyARM mark]# ./a
hw
233014694194567891921718192021222324253233342003738394041130
hw
233014694194567891921718192021222324253233342003738394041130
hw
233014694194567891921718192021222324253233342003738394041130
hw
233014694194567891921718192021222324253233342003738394041130
结论:不丢数了,是因为我成功的搞好mark校验了,本来就不应该丢数!!!!
=================================================================================================================================
2012年11月4日15:25:25:更新至:单片机串口调试丢包验证过程记录