2016-11-04 7 views
3

Я запускаю программу с двумя CAN-каналами (используя TowerTech CAN Cape TT3201).пишут: буферного пространства нет в наличии socket-can/linux-can

Два канала: can0 (500k) и can1 (125k). Каналы can0 работают отлично, но can1 запускает запись: Отсутствие ошибки в пространстве буфера.

Я использую ValueCAN3/VehicleSpy для проверки сообщений.

Это до того, как я запустил программу. can0 и can1 оба, кажется, отправляют, но только can0 появляется в VehicleSpy.

[email protected]:~# cansend can0 100#00 
[email protected]:~# cansend can1 100#20 

enter image description here

Это после того, как я попробуйте запустить программу

[email protected]:~# cansend can1 100#20 
write: No buffer space available 
[email protected]:~# cansend can0 111#10 

enter image description here

Хотя моя программа работает: Я получаю эту ошибку для всех сообщений, которые будут отправлены на CAN1

2016-11-02 15:36:03,052 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 12f83018 010 1 00 
2016-11-02 15:36:03,131 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 0af81118 010 6 00 00 00 00 00 00 
2016-11-02 15:36:03,148 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 12f81018 010 6 00 00 00 00 00 00 
2016-11-02 15:36:03,174 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 0af87018 010 3 00 00 00 
2016-11-02 15:36:03,220 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 12f89018 010 4 00 00 00 00 
2016-11-02 15:36:03,352 - can.socketcan.native.tx - WARNING - Failed to send: 0.000000 12f83018 010 1 00 

Однако иногда вся программа работает отлично (если модуль перезагружен или некоторые случайные экземпляры).

Как исправить это?

[email protected]:~# uname -r 
4.1.15-ti-rt-r43 

после делать некоторые рытье, я нашел это

[email protected]:-#ip -details link show can0 
4:can0: <NOARP,UP,LOWER_UP, ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 
     link/can promiscuity 0 
     can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 100 
     bitrate 500000 sample-point 0.875 
     tq 125 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 
     c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1 
     clock 24000000 
[email protected]:-#ip -details link show can1 
5: can1: <NOARP,UP,LOWER_UP, ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10 
     link/can promiscuity 0 
     can state STOPPED restart-ms 100 
     bitrate 125000 sample-point 0.875 
     tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 
     c_can: tseg1 2..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1 
     clock 8000000 

Оказывается, что CAN1 остановленный по какой-то причине

Однако, когда я пытаюсь:

ip link set can1 type can restart 
RNETLINK answers: Invalid argument 

ответ

-1

По попробовав ifconfig can1 up, он должен работать нормально ...

+0

Для уточнения ситуации или получения дополнительной информации, пожалуйста, используйте комментарий. Если вы уверены, что ваш ответ работает, удалите вопросительный знак и добавьте некоторое объяснение. –

+0

Указанная команда работает, поскольку я только что протестировал ее! Я задал вопрос, попытался ли он! Это достаточно ясно для вас? =) – marc

+0

Наверное, я недостаточно прояснился: вы уверены, что это ответ на конкретный вопрос наверху? Если да, * "удалите вопросительный знак и добавьте некоторое объяснение.* * Если основной целью этого ответа является запрос * «о том, если он попробовал» *, это действительно запрос дополнительной информации и, таким образом, должен быть комментарием. –

1

После включения интерфейса can0 с sudo ifconfig can0 up, запустите:

sudo ifconfig can0 txqueuelen 1000 

Это увеличит количество кадров, разрешенных в очереди передачи ядра для массового обслуживания дисциплины. Больше информации here

... иногда вся программа работает отлично (если модуль перезагружен или некоторые случайные экземпляры).

Причина, по которой она работает при перезагрузке интерфейса SocketCAN, заключается в том, что вы можете очистить достаточно буферного пространства, чтобы заставить его работать.