Timelysnow 发表于 2017-6-4 08:55

关于stellarium软件用lx200协议通过串口控制望远镜的问题

diy之路上遇见了一个难题,不知道为什么我的stellarium0.15.1串口监听的sd命令格式是这样子的

(文本结果:Sd -29?7:24#,hex监听结果3A 53 64 20 2D 32 39 DF 33 37 3A 32 34 23)

与前辈们监听结果不一样,正确的格式应该是:Sd -29*37:24#,开始分析是监听软件ASII码显示问题,但是hex监听的结果确实是多一个DF,退一步说DF显示也出现了问题,我就换了几种监听软件查看,都是同样的结果,最后从程序入手反回串口接收值,接收到的Sd命令后的参数部分是这个样子的
-2937:24,也就是说DF把*符吃掉了,这下问题大概清楚了,stellarium0.15.1输出的参数貌似就有问题,但是别人为什么没这个问题呢,是我的版本不对吗?疑惑中。也问过大师兄diy群里的大神们,问题暂时还没解决,主要就是DF导致我的命令解析出现诸多问题,特来求其他大神帮忙分析指点。
我相信有人遇见过同样的问题,请问如何解决呢?萌新在此先行谢过。

野草 发表于 2017-6-4 12:00

我用的是stellarium0.15.2。也是用LX200协议调了一个EQ3D双电跟的GOTO,需要的话可以把源码给你,已经调通了,没有遇到问题
if (command=='S'&&command=='d')//收到Sd回复 1
        {
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                command='1';
                DMA_SEND_DATA((u32)command ,1);
                dec_get_flag=1;
        }                               

野草 发表于 2017-6-4 12:06

本帖最后由 野草 于 2017-6-4 12:08 编辑

void LX200(void)
{
      u8 command ;
      u8 i=0,a;
      
      static u8 ra_get_flag=0,dec_get_flag=0;
      static u8 b;
      
      while(data!=':') //look FOR HEAD
      {
                i++;   
                if(i>20)
                {
                        break;
                }
      }
      for(a=0;a<19;a++)         //转存
      {
                command=data;
                i++;
      }
      
      /*ANALYZE AND REPLY*/
      if (command=='G'&&command=='R')   //GR 回复赤经 24h60m60s
      {
                current_ra=CURRENT_POS_RA(target_ra,ra_step);
                CURRENT_RA();
                DMA_SEND_DATA((u32)ra_out ,9);
      }
      
      if (command=='G'&&command=='D')//GD 回复赤纬 +-90:60:60
      {
                current_dec=CURRENT_POS_DEC(target_dec,dec_step);
                CURRENT_DEC();
                DMA_SEND_DATA((u32)dec_out ,10);
      }
      
      if (command=='Q'&&command=='r')//Sr 回复1
      {
                ra_in=command;
                ra_in=command;
                ra_in=command;
                ra_in=command;
                ra_in=command;
                ra_in=command;
                command='1';
                DMA_SEND_DATA((u32)command ,1);
                if(b<2)
                {
                        current_ra=RA_DEG_INTO_ARCSEC(ra_in);
                        target_ra=current_ra;
                        ra_step=0;
                        b++;
                }
                ra_get_flag=1;
      }
      
      if (command=='S'&&command=='d')//Sd 回复1
      {
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                command='1';
                DMA_SEND_DATA((u32)command ,1);
                if(b<2)
                {
                        current_dec=DEC_DEG_INTO_ARCSEC(dec_in);
                        target_dec=current_dec;
                        dec_step=0;
                        b++;
                }
                dec_get_flag=1;
      }                              
      
      if (command=='M'&&command=='r')//自定义命令Mr 回复1
      {
                ra_in=command;
                ra_in=command;
                ra_in=command;
                ra_in=command;
                ra_in=command;
                ra_in=command;
                command='1';
                DMA_SEND_DATA((u32)command ,1);
                current_ra=RA_DEG_INTO_ARCSEC(ra_in);
                target_ra=current_ra;
                ra_step=0;
      }
      
      if (command=='M'&&command=='d')//自定义命令Md 回复1
      {
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                dec_in=command;
                command='1';
                DMA_SEND_DATA((u32)command ,1);
                current_dec=DEC_DEG_INTO_ARCSEC(dec_in);
                target_dec=current_dec;
                dec_step=0;
      }      
      
      if (command=='M'&&command=='S')//Ms 回复0
      {
                command='0';
                DMA_SEND_DATA((u32)command ,1);
      }
      
      if (ra_get_flag==1&&dec_get_flag==1)   //ra dec目标更新后进行解算
      {
                ra_get_flag=0;   //清除更新标志
                dec_get_flag=0;
                goto_flag=1;
                target_ra=RA_DEG_INTO_ARCSEC(ra_in);
                target_dec=DEC_DEG_INTO_ARCSEC(dec_in);
                ra_step=CALCULATE_RA(current_ra,target_ra);
                dec_step=CALCULATE_DEC(current_dec,target_dec);
      }
}

ccqhms 发表于 2017-6-4 12:31

看不懂,顶高手。

蝶梦 发表于 2017-6-4 12:46

我只看过SkyWatcher Synscan协议。不过我觉得要解决这个问题,可以看看Stellarium的源代码。

Timelysnow 发表于 2017-6-4 14:50

野草 发表于 2017-6-4 12:06
void LX200(void)
{
      u8 command ;


嗯,十分感谢您的支援,向前辈致敬,我比较懒,是直接用标准输入输出函数进行命令回复的,没有自己编写发送函数,缺点是会慢一些,但是也够用了。不知道您用哪个单片机?

Timelysnow 发表于 2017-6-4 14:55

蝶梦 发表于 2017-6-4 12:46
我只看过SkyWatcher Synscan协议。不过我觉得要解决这个问题,可以看看Stellarium的源代码。 ...

看源码对我来说就是大海捞针,不知道这个对lx200协议的描述部分在哪个目录下,但是确实有必要刨根问底。因为有其他前辈也遇见了同样的问题说这个是显示问题不影响,我的实验监听结果我暂时还无法接受这种说法,因为尝试了各种监听,包括从接收缓存器直接读数据都是不符合协议格式的。感谢您的建议。

野草 发表于 2017-6-4 17:20

本帖最后由 野草 于 2017-6-4 18:16 编辑

Timelysnow 发表于 2017-6-4 14:50
嗯,十分感谢您的支援,向前辈致敬,我比较懒,是直接用标准输入输出函数进行命令回复的,没有自己编写发 ...
我用的是STM32F103C8,因为要产生定时器中断和串口接收中断,所以时序要求比较高,输入输出全部用DMA,不占CPU时间。
用STM32在线仿真和我用串口助手监听都没有遇到你说的不能正常读取的问题,唯一一个有乱码的地方就是有一个地方“:”变成了“?”。但是这个地方根本不影响我读其他位的数据,所以你看我程序里面也把那些没用的冒号全部忽略了。其次,因为LX200用的是ASCII明码,所以不需要看HEX接收,就看ASCII字符接收就行了。

野草 发表于 2017-6-4 17:36

本帖最后由 野草 于 2017-6-7 19:36 编辑

兄弟,刚才又手动监听了一次,我把我用到的对话信息全部发给你
建立连接时
Stellarium发送 “#:GR#”      下位机回复 “00:00:01#”      //下位机回复当前赤经值
Stellarium发送 “#:GD#”   下位机回复 “+00:00:01#”      //下位机回复当前赤纬值

按CTRL1指向目标时
Stellarium发送“#:Q#:Sr 11:36:05#”    下位机回复“1”      //上位机发送目标赤经值,下位机回复1表示收到
Stellarium发送“:Sd -47?28:13#”      下位机回复“1”      //上位机发送目标赤纬值,下位机回复1表示收到
Stellarium发送“:MS#”                      下位机回复“0”      //上位机询问下位机是否能转到该位置,下位机回复0表示可以

这就是我GOTO用到的全部命令字,没别的啦。



蝶梦 发表于 2017-6-4 18:04

Timelysnow 发表于 2017-6-4 14:55
看源码对我来说就是大海捞针,不知道这个对lx200协议的描述部分在哪个目录下,但是确实有必要刨根问底。 ...

其实这部分源代码我以前也没看过。今天看了一下,应该在源代码的plugins/TelescopeControl/src下。

蝶梦 发表于 2017-6-4 18:10

本帖最后由 蝶梦 于 2017-6-4 18:14 编辑

(文本结果:Sd -29?7:24#,hex监听结果3A 53 64 20 2D 32 39 DF 33 37 3A 32 34 23)
这段16进制按ASCII应该是“:Sd -29?37:24#”,只有星号不正确。后面的3消失应该是字符编码的问题。

野草 发表于 2017-6-4 18:21

蝶梦 发表于 2017-6-4 18:10
这段16进制按ASCII应该是“:Sd -29?37:24#”,只有星号不正确。后面的3消失应该是字符编码的问题。
...

正解

蝶梦 发表于 2017-6-4 18:24

刚才看了Stellarium的源代码,发现代码里写的确实是'\xDF',而不是'*'。不知为什么要这样写。

野草 发表于 2017-6-5 09:44

蝶梦 发表于 2017-6-4 18:24
刚才看了Stellarium的源代码,发现代码里写的确实是'\xDF',而不是'*'。不知为什么要这样写。 ...

其实无关紧要,这一位数据忽略掉也不参与解码,不影响收数据

v2500 发表于 2017-6-5 12:36

Timelysnow 发表于 2017-6-5 16:05

嗯,我也看了源码,现在问题解决了,谢谢大家。

Timelysnow 发表于 2017-6-5 16:09

野草 发表于 2017-6-4 17:20
我用的是STM32F103C8,因为要产生定时器中断和串口接收中断,所以时序要求比较高,输入输出全部用DMA,不 ...

感谢!问题已解决,我的程序搞复杂了些。

弼马温1984 发表于 2017-6-5 16:41

野草 发表于 2017-6-4 17:36
兄弟,刚才又手动监听了一次,我把我用到的对话信息全部发给你
建立连接时
Stellarium发送 “#:GR#”       ...

高手有空加群指导一下
欢迎加入DIY天文望远镜GOTO,群号码:562140617

Timelysnow 发表于 2017-6-5 16:46

野草 发表于 2017-6-4 17:36
兄弟,刚才又手动监听了一次,我把我用到的对话信息全部发给你
建立连接时
Stellarium发送 “#:GR#”       ...

感谢!前辈+高手+热心肠,请+大师兄DIY群,一起讨论。

anyway132 发表于 2017-7-14 17:09

Timelysnow 发表于 2017-6-5 16:05
嗯,我也看了源码,现在问题解决了,谢谢大家。

请问stellarium的源代码在那个文件夹?
页: [1] 2
查看完整版本: 关于stellarium软件用lx200协议通过串口控制望远镜的问题