Linux 串口;我写的东西看不懂

Linux 串口;我写的东西看不懂,linux,serial-port,rtai,Linux,Serial Port,Rtai,当我随机生成数据时,我无法读取发送到串行端口的数据,我希望通过COM1发送数据,并使用两个不同的实时线程从COM2读取数据 我使用了RTAI函数 让我们说;我发送一些随机字节和0x01;但是,我无法读取某些字节和0x01。我读取的值与通过串行端口发送的值不同。 原因可能是什么? 1-)我正在COM1和COM2之间使用零调制解调器电缆 2-)我已经按顺序发布了作者和读者的脚本。 3-)串行端口传输(写入端)为rt_sperr提供错误,很可能是溢出或缓冲区已满错误。 4-)我在用户空间中复制了这个项

当我随机生成数据时,我无法读取发送到串行端口的数据,我希望通过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;