Linux 串口;我写的东西看不懂
当我随机生成数据时,我无法读取发送到串行端口的数据,我希望通过COM1发送数据,并使用两个不同的实时线程从COM2读取数据 我使用了RTAI函数 让我们说;我发送一些随机字节和0x01;但是,我无法读取某些字节和0x01。我读取的值与通过串行端口发送的值不同。 原因可能是什么? 1-)我正在COM1和COM2之间使用零调制解调器电缆 2-)我已经按顺序发布了作者和读者的脚本。 3-)串行端口传输(写入端)为rt_sperr提供错误,很可能是溢出或缓冲区已满错误。 4-)我在用户空间中复制了这个项目,我遇到了一条资源暂时不可用的消息,这与串行端口的大小有关吗?如果是,你能给我建议一个地方阅读有关调整串行端口缓冲区大小的内容吗。 你建议我采取什么行动? 最好的Linux 串口;我写的东西看不懂,linux,serial-port,rtai,Linux,Serial Port,Rtai,当我随机生成数据时,我无法读取发送到串行端口的数据,我希望通过COM1发送数据,并使用两个不同的实时线程从COM2读取数据 我使用了RTAI函数 让我们说;我发送一些随机字节和0x01;但是,我无法读取某些字节和0x01。我读取的值与通过串行端口发送的值不同。 原因可能是什么? 1-)我正在COM1和COM2之间使用零调制解调器电缆 2-)我已经按顺序发布了作者和读者的脚本。 3-)串行端口传输(写入端)为rt_sperr提供错误,很可能是溢出或缓冲区已满错误。 4-)我在用户空间中复制了这个项
#包括
#包括
#包括
#包括“rtai.h”
#包括“rtai_附表h”
#包括“rtai_sem.h”
#包括“rtai_serial.h”
#ifndef\u P1003\u 1B\u可见
#定义MCL_当前0x0001
#定义MCL_未来0x0002
#定义\u P1003\u 1B\u可见
#恩迪夫
#如果!已定义(RT_最低优先级)
#如果已定义(RT_SCHED_最低优先级)
#定义RT_最低优先级RT_计划最低优先级
#否则
#错误RT_SCHED_最低优先级未定义
#恩迪夫
#恩迪夫
#定义任务优先级1
#包括
#包括
#如果LINUX版本代码>内核版本(2,4,0)
模块许可证(“GPL”);
#恩迪夫
#定义勾号周期10000000
#定义堆栈大小1024
#定义波特率115200
#定义其8
#定义停止位1
#定义两个PWR31M1 2147483647
静态RT_任务模拟器_任务;
静态RTIME模拟器周期=31857600;
静态RTIME现在;
静态扫描电镜;
静态内联长次随机数(长随机数)
{
常数长a=16807;
const long m=TWOPWR31M1;
常数长q=127773;
常数长r=2836;
龙洛,你好,;
hi=兰特/q;
lo=兰德-高*q;
兰德=a*lo-r*hi;
if(rand内核_版本(2,4,0)
模块许可证(“GPL”);
#恩迪夫
静态RTIME周期=31857600;
静态扫描电镜;
结构rt_任务\u结构rt_任务1;
静态无效任务_读取(长整型参数)
{
int i=0;
无符号字符cha[367];
无符号字符mydata[362];
无符号整数最大数据长度=367;
无符号整数max\u mydata\u len=362;
内特里尔;
而(1){
rt\u spclear\u rx(COM2);
//ierr=rt\u sem\u wait(&eben);
时间间隔(COM2,(字符*)cha,最大数据长度,永久延迟);
对于(i=0;i好,当你发送到DCE设备时,DCE设备发送的是你将接收的。你不接收你发送的。你不能简单地用电缆连接你的两个串行端口,因为没有DCE设备。你需要一个空调制解调器。你如何连接?你是否交叉接收和发送?你使用相同的波特率?i有一根从com1到com2的空调制解调器电缆。我在我的脚本中定义波特率为#define Baudrate 112500;,用于编写器脚本和读取器脚本。我的问题是:如果我永远无法读取我发送的内容,那么我该如何安装一个准确的系统。我已经输入了读取程序代码?在读取程序代码中,我是否需要输入udelay()@thorstainerk,我用读取脚本更新了它
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/version.h>
#include "rtai.h"
#include "rtai_sched.h"
#include "rtai_sem.h"
#include "rtai_serial.h"
#ifndef _P1003_1B_VISIBLE
#define MCL_CURRENT 0x0001
#define MCL_FUTURE 0x0002
#define _P1003_1B_VISIBLE
#endif
#if ! defined(RT_LOWEST_PRIORITY)
#if defined(RT_SCHED_LOWEST_PRIORITY)
#define RT_LOWEST_PRIORITY RT_SCHED_LOWEST_PRIORITY
#else
#error RT_SCHED_LOWEST_PRIORITY not defined
#endif
#endif
#define TASK_PRIORITY 1
#include <linux/errno.h>
#include <asm/io.h>
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,0)
MODULE_LICENSE("GPL");
#endif
#define TICK_PERIOD 10000000
#define STACK_SIZE 1024
#define BAUD 115200
#define NUMBITS 8
#define STOPBITS 1
#define TWOPWR31M1 2147483647
static RT_TASK simulator_task;
static RTIME simulator_period_ns = 31857600;
static RTIME now;
static SEM eben;
static inline long next_rand(long rand)
{
const long a = 16807;
const long m = TWOPWR31M1;
const long q = 127773;
const long r = 2836;
long lo, hi;
hi = rand/q;
lo = rand - hi*q;
rand = a*lo - r*hi;
if (rand <= 0) {
rand += m;
}
return rand;
}
static inline long irandu(unsigned long range)
{
static long seed = 783637;
const long m = TWOPWR31M1;
seed = next_rand(seed);
return rtai_imuldiv(seed, range, m);
}
void generate_rn(int mean, int std, unsigned int *x){
unsigned int a=0, b=0;
unsigned long rand_num=0;
unsigned long rand_max = 100;
int fp, ret;
a=mean-2*std;
b=mean+2*std;
rand_num = irandu(rand_max);
*x = a + ((b-a)*rand_num)/rand_max;
}
void simulasyon(long int arg)
{
unsigned int unit_data=0 ;
unsigned int size = 367;
unsigned char mydata[size];
int min=0, max=0;
int rand_num=0;
int rand_max = 100;
int std=1;
int i;
int ierr;
mydata[0] = 'A';
mydata[1] = 'S';
mydata[2] = 'C';
mydata[3] = 'I';
mydata[size-1] = 0x01;
while(1){
for(i = 4 ; i < size-1 ; i ++){
generate_rn(i, 1, &unit_data);
mydata[i] = unit_data;
}
//ierr= rt_sem_wait(&eben);
rt_spclear_tx(COM1);
ierr= rt_spwrite_timed(COM1,(void *)mydata, size,
DELAY_FOREVER);
//if(ierr=-1){printk("succes\n");}
rt_task_wait_period();
}
return;
}
int init_module(void)
{
RTIME simulator_period_count;
RTIME timer_period_count;
int retval;
int res;
int mutx;
res=rt_spopen(COM1, BAUD, NUMBITS, STOPBITS,RT_SP_PARITY_NONE,
RT_SP_NO_HAND_SHAKE, RT_SP_FIFO_DISABLE);
if(res) {
printk("Error: rt_spopen\n");
switch(res) {
case -ENODEV:
printk("No device %d\n", res);
break;
case -EINVAL:
printk("Invalid val %d\n", res);
break;
case -EADDRINUSE:
printk("Address in use %d\n", res);
break;
default:
printk("Unknown %d\n", res);
break;
}
do_exit(0); }
//rt_typed_sem_init(&eben, 0, BIN_SEM);
rt_spclear_tx(COM1);
rt_set_periodic_mode();
simulator_period_count = nano2count(simulator_period_ns);
timer_period_count = start_rt_timer(simulator_period_count);
retval = rt_task_init(&simulator_task,
simulasyon,
0,
1024,
RT_LOWEST_PRIORITY,
0,
0);
if (0 != retval) {
if (-EINVAL == retval) {
printk("periodic task: task structure already in use\n");
} else if (-ENOMEM == retval) {
printk("periodic task: can't allocate stack\n");
} else {
printk("periodic task: error initializing task structure\n");
}
return retval;
}
retval = rt_task_make_periodic(&simulator_task,
rt_get_time() + simulator_period_count,
simulator_period_count);
if (0 != retval) {
if (-EINVAL == retval) {
printk("periodic task: task structure is invalid\n");
} else {
printk("periodic task: error starting task\n");
}
return retval;
}
return 0;
}
void cleanup_module(void)
{
int retval;
retval = rt_task_delete(&simulator_task);
if (0 != retval) {
if (-EINVAL == retval) {
printk("periodic task: task structure is invalid\n");
} else {
printk("periodic task: error stopping task\n");
}
}
//rt_stop_timer();
//rt_busy_sleep(10000000);
rt_spclose(COM1);
//rt_sem_delete(&eben);
return;
}
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/version.h>
#include "rtai.h"
#include "rtai_serial.h"
#include "rtai_sched.h"
#include "rtai_fifos.h"
#include <rtai_sem.h>
#define BAUD 115200
#define NUMBITS 8
#define STOPBITS 1
#define TASK_PRIORITY 1
#define TICK_PERIOD 10000000
#define STACK_SIZE 1024
#if ! defined(RT_LOWEST_PRIORITY)
#if defined(RT_SCHED_LOWEST_PRIORITY)
#define RT_LOWEST_PRIORITY RT_SCHED_LOWEST_PRIORITY
#else
#error RT_SCHED_LOWEST_PRIORITY not defined
#endif
#endif
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,0)
MODULE_LICENSE("GPL");
#endif
static RTIME tick_period_ns = 31857600;
static SEM eben;
struct rt_task_struct rt_task1;
static void task_read (long int arg)
{
int i=0;
unsigned char cha[367];
unsigned char mydata[362];
unsigned int max_data_len=367;
unsigned int max_mydata_len=362;
int ierr;
while(1){
rt_spclear_rx(COM2);
//ierr= rt_sem_wait(&eben);
rt_spread_timed(COM2, (char *) cha , max_data_len, DELAY_FOREVER);
for (i=0;i<367;i++){
//ierr=rt_sem_signal(&eben);
//printk("ch[%d], %d\n", i, ch[i]);
}
if (cha[0]=='A' && cha[1]=='S' && cha[2]=='C' && cha[3]=='I' && cha[size]==0x01 )
{
for (i=0;i<362;i++)
{
mydata[i]=cha[i+4];
rtf_put(0, (char *)mydata, max_mydata_len); //PUTTING DATA IN FIFO
}
rt_task_wait_period();
}
return;
}
int init_module(void)
{
int res;
int retval;
RTIME tick_period_get;
RTIME tick_period_count;
res=rt_spopen(COM2, BAUD, NUMBITS, STOPBITS, RT_SP_PARITY_ODD, RT_SP_NO_HAND_SHAKE, RT_SP_FIFO_DISABLE);
if(res) {
printk("Error: rt_spopen\n");
switch(res) {
case -ENODEV:
printk("No device %d\n", res);
break;
case -EINVAL:
printk("Invalid val %d\n", res);
break;
case -EADDRINUSE:
printk("Address in use %d\n", res);
break;
default:
printk("Unknown %d\n", res);
break;
}
do_exit(0);
}
rt_spclear_rx(COM2);
retval = rtf_create(0,4096);
if (retval) {
printk("could not create RT-FIFO /dev/rtf0\n");
return retval;
}
rtf_reset(0);
rt_set_periodic_mode();
tick_period_get = nano2count(tick_period_ns);
tick_period_count = start_rt_timer(tick_period_get);
rt_typed_sem_init(&eben, 0, BIN_SEM);
retval=rt_task_init(&rt_task1, task_read, 0, 1024, RT_LOWEST_PRIORITY,0,0);
if (0 != retval) {
if (-EINVAL == retval) {
/* task structure is already in use */
printk("periodic task: task structure already in use\n");
} else if (-ENOMEM == retval) {
/* stack could not be allocated */
printk("periodic task: can't allocate stack\n");
} else {
/* unknown error */
printk("periodic task: error initializing task structure\n");
}
return retval;
}
retval = rt_task_make_periodic(&rt_task1, rt_get_time() + tick_period_get, tick_period_get);
if (0 != retval) {
if (-EINVAL == retval) {
/* task structure is already in use */
printk("periodic task: task structure is invalid\n");
} else {
printk("periodic task: error starting task\n");
}
return retval;
}
return 0; }
void cleanup_module(void)
{
//rt_sem_delete(&eben);
stop_rt_timer();
rtf_destroy(0);
rt_task_delete(&rt_task1);
rt_spclose(COM2);
return;